为何以下C++代码运行后生成的balances.txt文件内容为空?
问题根因
- 打开模式配置错误
你使用fstream::app模式打开文件,该模式要求所有写入操作都追加到文件末尾,同时文件打开后读写指针默认定位在文件尾部。如果balances.txt为空,初始化语句bank_file >> number会直接读取到EOF,触发流的failbit错误标识,后续所有的流操作(包括写入)都会直接失效,哪怕进入循环也不会写入任何数据。 - 读写操作缺少同步
fstream的读、写操作共用同一个位置指针,在读写操作切换时必须先调用seekg()/seekp()调整指针位置,或调用flush()刷新缓冲区,否则行为未定义,大概率出现写入失效的问题。你的代码在读取后直接执行写入,未做任何同步处理,本身就不符合fstream的使用规范。 - 循环逻辑存在隐含问题
你将读取操作放在for循环的初始化和增量位置,就算文件有内容能正常读取,一旦某次读取触发EOF,流的错误标识会持续生效,后续所有写入都会被丢弃,不会自动恢复。
修复方案
如果你需要实现的效果是:读取文件已有的最后一个数值,向后追加写入100个递增的浮点数,文件不存在时自动从0开始写入,可以参考如下修改代码:
#include<fstream> #include<iostream> using namespace std; int main() { fstream bank_file; float number = 0.0; // 先尝试读写模式打开,文件不存在时会打开失败 bank_file.open("balances.txt", fstream::in | fstream::out); if (!bank_file.is_open()) { // 文件不存在,先创建并写入初始值0 bank_file.open("balances.txt", fstream::out); bank_file << number << endl; bank_file.close(); // 重新以读写模式打开 bank_file.open("balances.txt", fstream::in | fstream::out); } // 读取文件中所有已有数值,拿到最后一个值 while (bank_file >> number); // 清除读操作触发的EOF错误标识 bank_file.clear(); // 将写指针定位到文件末尾 bank_file.seekp(0, ios::end); // 写入100个递增的数值 for (int count = 0; count < 100; count++) { number++; bank_file << number << endl; cout << number << endl; } bank_file.close(); return 0; }
修改说明:
- 改用
fstream::in | fstream::out读写模式打开,避免app模式带来的指针定位问题 - 增加文件不存在的兼容逻辑,自动创建初始化初始值
- 拆分读写逻辑,读取完成后先清除错误标识、调整写指针位置再执行写入
- 循环中仅执行写入操作,避免读写交替触发的未定义行为
内容的提问来源于stack exchange,提问作者kme
相关产品推荐
相关产品推荐

