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

C++读取txt排行榜文件存入int数组出现垃圾值如何解决

错误原因分析

你的代码出现全垃圾值是由多个逻辑错误共同导致的,核心问题如下:

  • 读取文件的循环条件写反:for (int i = 0; inputFileStream.eof(); i++) 中,刚打开文件时未触发EOF,循环条件直接为假,一次读取操作都不会执行,数组全程是未初始化的栈内存,值就是你看到的-858993460。
  • 写入新得分时直接清空了原有记录:调用ofstream.open("topboard.txt")默认使用trunc模式,会直接清空文件原有内容,原来的10条历史得分直接被删除,文件里只会留下你刚写的换行+新得分。
  • 读取逻辑未做越界判断:没有限制循环次数,万一文件行数超过11行,会发生数组越界,导致内存污染。
  • 写回文件时未加换行符:所有得分连在一起写入,下次读取时会被识别为一个超大的整数,逻辑完全错误。
修复后的完整代码
void stopGame() {
    gameOver = true;
    int topboard[11] = {0}; // 初始化数组,避免未访问位置残留垃圾值
    int readCount = 0;

    // 第一步:先读取原有全部得分
    ifstream inputFileStream;
    inputFileStream.open("topboard.txt");
    // 读取时同时判断读取成功、未到EOF、不超数组长度
    while (readCount < 11 && inputFileStream >> topboard[readCount]) {
        readCount++;
    }
    inputFileStream.close();

    // 第二步:把本次新得分加入数组末尾
    topboard[readCount] = score;
    readCount++;

    // 第三步:这里做排序逻辑,示例为降序排序取前10
    sort(topboard, topboard + readCount, greater<int>());

    // 第四步:排序后写回前10名到文件
    ofstream fileOutputStream;
    fileOutputStream.open("topboard.txt", ios_base::trunc);
    for (int i = 0; i < 10 && i < readCount; i++) {
        fileOutputStream << topboard[i] << endl; // 每个得分加换行,方便下次读取
    }
    fileOutputStream.close();
};
关键修改说明
  • 调整了操作顺序:先读原有历史记录,再添加新得分,避免直接清空原有数据
  • 修正了读取循环的判断逻辑:用输入流 >> 变量的返回值作为判断条件,同时限制数组最大下标,既避免EOF判断的常见误区,也防止数组越界
  • 数组初始化:声明时默认初始化为0,就算有效得分不足10,写入的也是0而非垃圾值
  • 写入时添加换行符,保证后续读取可以正常拆分每条得分

内容的提问来源于stack exchange,提问作者DaniilV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:15:03