saveGame函数无法写入PlayerData.txt文件问题求助
存档函数写入失败的排查与修复
核心问题1:未使用的文件流占用目标文件
在TakeTurn()函数开头,你创建了一个ofstream saveFile("PlayerData.txt");对象但未使用。这个对象会在函数执行期间持续占用文件锁(默认以截断模式打开,还会清空文件内容),导致后续调用saveGame()时无法重复打开同一文件,最终写入失败。
修复方式:删除这行无用代码:
ofstream saveFile("PlayerData.txt"); // 直接移除该行
核心问题2:重复调用存档函数
在s选项分支里,你连续调用了两次saveGame():
saveGame(ThePlayer, PlayerData); // 冗余的第一次调用 if (saveGame(ThePlayer, PlayerData)) { // 第二次调用
这不仅浪费资源,还会导致重复写入。只需保留一次调用即可:
if (saveGame(ThePlayer, PlayerData)) { cout << "Game saved successfully.\n"; } else { cout << "Failed to save game.\n"; }
额外排查点
若修复后仍无法写入,检查以下内容:
- 工作目录偏移:程序运行的当前目录可能不是项目根目录,
PlayerData.txt可能被写到了编译输出目录(如Debug/或Release/)。可通过输出当前目录确认:#include <filesystem> // 在需要的位置添加 cout << "当前工作目录: " << std::filesystem::current_path() << endl; - 权限限制:程序所在目录可能无写入权限,尝试将程序移至用户文档等有权限的目录运行。
- Player类getter有效性:确认
GetLevel()、GetGold()、GetExperience()返回的是正确数值,避免写入空值或错误数据。
修复后的存档分支代码示例
case 's': if (saveGame(ThePlayer, PlayerData)) { cout << "Game saved successfully.\n"; } else { cout << "Failed to save game.\n"; } cin.ignore(); cin.get(); return; break;
内容的提问来源于stack exchange,提问作者ProfGoat
相关产品推荐
相关产品推荐

