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

游戏分数系统开发问题:如何覆写文件首行并追加玩家分数

分数系统文件写入问题修复

问题根源

你的代码存在两个核心问题:

  1. 文件覆盖导致历史玩家记录丢失
    每次调用saveScore时,第一个ofstream total("score.txt")会默认以ios::trunc模式打开文件——这会直接清空文件内所有原有内容,再写入更新后的总分。后续用ios::app追加新玩家信息时,之前的玩家记录已经被删掉了,最终文件里只会保留最新的总分和当前调用的玩家信息。
  2. 传值参数导致总分计算错误(隐藏bug)
    函数参数int scoreTotal是传值传递,函数内的scoreTotal += score只会修改局部变量,外部的scoreTotal不会被更新。如果外部没有手动同步总分,多次调用后写入的总分会完全错误。

修复方案

下面是修正后的代码,逻辑是先读取历史玩家记录,再重新写入总分+所有玩家记录(旧记录+新记录):

#include <fstream>
#include <string>
#include <vector>

void saveScore(int& scoreTotal, int score, const std::string& input) {
    // 更新总分(引用传递确保外部变量同步更新)
    scoreTotal += score;

    // 读取文件中已有的玩家记录(跳过首行的总分)
    std::vector<std::string> playerRecords;
    std::ifstream inFile("score.txt");
    if (inFile.is_open()) {
        std::string line;
        // 跳过首行的总分
        std::getline(inFile, line);
        // 读取剩余的玩家记录行
        while (std::getline(inFile, line)) {
            if (!line.empty()) {
                playerRecords.push_back(line);
            }
        }
        inFile.close();
    }

    // 重新写入完整内容:总分 + 旧玩家记录 + 新玩家记录
    std::ofstream outFile("score.txt");
    if (outFile.is_open()) {
        // 写入最新总分
        outFile << scoreTotal << std::endl;
        // 写入历史玩家记录
        for (const auto& record : playerRecords) {
            outFile << record << std::endl;
        }
        // 写入当前新玩家记录
        outFile << input << " : " << score;
        outFile.close();
    }
}

关键改进点

  • 将scoreTotal改为引用传递(int& scoreTotal),确保函数内的总分更新能同步到外部变量,避免计算错误。
  • 先读取历史玩家记录,再以覆盖模式重新写入文件,既保证首行总分被覆写,又保留了所有玩家的历史信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 08:33:36