C++读写文件后内容未更新问题求助
文件读写不更新的问题解决
问题原因
你遇到的核心问题是:用std::ios::out | std::ios::in模式打开文件后,读取内容时文件指针会移动到读取结束的位置,直接写入新内容不会覆盖原有文件,而是在当前指针位置追加或部分覆盖,导致旧内容残留。此外,原代码缺少文件打开失败的判断,也无法排查路径或权限问题。
修正方案
方案一:重置指针并截断文件
读取内容后,将写指针移回文件开头,截断文件清除原有内容,再写入新值:
#include <iostream> #include <fstream> #include <string> #include <cstdlib> #include <ctime> int main() { // 初始化随机数种子,保证每次运行x值不同 std::srand(std::time(nullptr)); long int moy; std::string line; std::fstream file; long int x = 35 + (std::rand() % (37 - 35 + 1)); file.open("C:/Users/MSI/Desktop/omnetpp-6.0.1/samples/inet4/src/inet/applications/udpapp/B1.txt", std::ios::out | std::ios::in); if (!file.is_open()) { std::cerr << "无法打开目标文件" << std::endl; return 1; } std::getline(file, line); std::cout << line << std::endl; moy = (x + std::stoi(line)) / 2; // 将写指针移到文件开头,截断文件清除原有内容 file.seekp(0); file.truncate(); file << moy << std::endl; file.close(); return 0; }
方案二:分两次打开文件(读+写)
先以只读模式读取内容,关闭后再以写入模式打开覆盖原有内容:
#include <iostream> #include <fstream> #include <string> #include <cstdlib> #include <ctime> int main() { std::srand(std::time(nullptr)); long int moy; std::string line; long int x = 35 + (std::rand() % (37 - 35 + 1)); // 只读模式读取文件内容 std::ifstream inFile("C:/Users/MSI/Desktop/omnetpp-6.0.1/samples/inet4/src/inet/applications/udpapp/B1.txt"); if (!inFile.is_open()) { std::cerr << "无法打开文件读取内容" << std::endl; return 1; } std::getline(inFile, line); inFile.close(); std::cout << line << std::endl; moy = (x + std::stoi(line)) / 2; // 写入模式打开,直接覆盖原有内容 std::ofstream outFile("C:/Users/MSI/Desktop/omnetpp-6.0.1/samples/inet4/src/inet/applications/udpapp/B1.txt"); if (!outFile.is_open()) { std::cerr << "无法打开文件写入内容" << std::endl; return 1; } outFile << moy << std::endl; outFile.close(); return 0; }
额外说明
- 必须添加
std::srand(std::time(nullptr))初始化随机数种子,否则每次运行程序生成的x值可能重复。 - 加入文件打开失败的判断,可以快速定位路径错误、文件权限不足等问题。
内容的提问来源于stack exchange,提问作者Omaima Younsi
相关产品推荐
相关产品推荐

