You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何以下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:57:04