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

C++数组实现排行榜写入文件失败求助:无法更新文件内容

问题根源分析

你的代码有三个核心问题导致文件内容始终不变:

  • 每次运行程序,排行榜数组都是硬编码初始化固定值,完全不读取之前文件里的旧数据,相当于每次都从头创建排行榜
  • 处理用户新分数的逻辑完全搞反了:你现在的代码是把userName和userScore改成数组里第一个分数更低的旧数据,而不是把新用户的信息插入到排行榜里
  • 没有对数组做任何更新操作,最后写入文件的还是初始的固定数组
修复方案

要实现“每次运行添加新用户并更新文件”的效果,需要做这几件事:

  1. 程序启动时先从文件读取已有的排行榜数据(如果文件存在)
  2. 把新用户的分数和姓名插入到排行榜的正确位置(按分数从高到低排序)
  3. 将更新后的排行榜重新写入文件

以下是修改后的完整代码:

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:14:52