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
相关产品推荐
相关产品推荐

