C++数组实现排行榜写入文件失败求助:无法更新文件内容
问题根源分析
你的代码有三个核心问题导致文件内容始终不变:
- 每次运行程序,排行榜数组都是硬编码初始化固定值,完全不读取之前文件里的旧数据,相当于每次都从头创建排行榜
- 处理用户新分数的逻辑完全搞反了:你现在的代码是把
userName和userScore改成数组里第一个分数更低的旧数据,而不是把新用户的信息插入到排行榜里 - 没有对数组做任何更新操作,最后写入文件的还是初始的固定数组
修复方案
要实现“每次运行添加新用户并更新文件”的效果,需要做这几件事:
- 程序启动时先从文件读取已有的排行榜数据(如果文件存在)
- 把新用户的分数和姓名插入到排行榜的正确位置(按分数从高到低排序)
- 将更新后的排行榜重新写入文件
以下是修改后的完整代码:
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <algorithm> using namespace std; const int MAX_RANK = 3; // 排行榜最多保留3个名额 int main() { // 初始化排行榜数组,先尝试从文件读取旧数据 char names[MAX_RANK][100]; int scores[MAX_RANK]; int currentCount = 0; // 当前排行榜的有效条目数 FILE* filePr = fopen("example.txt", "r"); if (filePr != nullptr) { // 读取文件里的旧数据 while (currentCount < MAX_RANK && fscanf(filePr, "Score and name %s %d", names[currentCount], &scores[currentCount]) == 2) { currentCount++; } fclose(filePr); } // 新用户的信息(可改为用户输入,这里用你提供的测试值) string newUserName = "aud"; int newUserScore = 12; // 找到新用户应该插入的位置 int insertPos = currentCount; // 默认插在末尾 for (int i = 0; i < currentCount; i++) { if (newUserScore > scores[i]) { insertPos = i; break; } } // 如果还有空位,或者新分数够高能挤入排行榜,就插入 if (currentCount < MAX_RANK || insertPos < MAX_RANK) { // 把插入位置后的元素后移一位 for (int i = min(currentCount, MAX_RANK - 1); i > insertPos; i--) { strcpy(names[i], names[i-1]); scores[i] = scores[i-1]; } // 插入新用户数据 strcpy(names[insertPos], newUserName.c_str()); scores[insertPos] = newUserScore; // 更新有效条目数(不超过最大值) if (currentCount < MAX_RANK) { currentCount++; } } // 将更新后的排行榜写入文件 filePr = fopen("example.txt", "w"); if (filePr != nullptr) { for (int i = 0; i < currentCount; i++) { fprintf(filePr, "Score and name %s %d\n", names[i], scores[i]); } fclose(filePr); } cout << "排行榜已更新,文件内容已写入" << endl; return 0; }
代码改动说明
- 新增从文件读取旧数据的逻辑,启动时先加载之前的排行榜
- 修正新用户插入逻辑:找到分数更高的位置,后移元素再插入,保证排行榜按分数从高到低排序
- 限制排行榜最多保留3个名额,超过时只保留分数最高的3个
- 处理了文件不存在的情况(第一次运行时会自动创建新文件)
内容的提问来源于stack exchange,提问作者auden monteith
相关产品推荐
相关产品推荐

