嗨,大家好我正在研究一个RPG游戏的学校项目。我创建了一个load_game函数,它应该通过一个特定的文件,检查文件是否具有用户输入的id,并将特定的字符统计信息加载到全局变量中。 问题是我创建了一个函数来打印文件的内容,以便用户可以看到他们的选项,但它根本不打印任何东西,我做了一个new_player函数,用新的播放器填充相同的文件,并且正常工作。当我将文件更改为另一个文件并手动写入该文件时,它可以正常工作。这是代码:
void load_game()
{
bool loading = true;
do{
ifstream in_stream("Players.txt");
ofstream out_stream("Players.txt");
cout << " The last son of Allheaven " << endl;
cout << "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+" << endl;
char ch;
in_stream.clear();
in_stream.seekg(0, in_stream.beg);
while (in_stream.get(ch))
{
cout << ch;
}
cout << " Enter -1 to return to main menu " << endl;
cout << "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+" << endl;
cout << endl << "Enter a number to access one of the above options: ";
in_stream.clear();
in_stream.seekg(0, in_stream.beg);
int choice;
cin >> choice;
while (in_stream >> ID >> Name >> Class >> HP >> Mana >> ATK >> ability_dmg >> Defense >> magic_resist >> player_exp >> player_level)
{
if (choice == ID)
{
/*game_start();*/
loading = false;
break;
}
else if (choice == -1)
{
system("cls");
main_menu();
}
else if (in_stream.eof())
{
in_stream.clear();
in_stream.seekg(0, in_stream.beg);
cout << endl << "Error! Invalid ID !" << endl;
}
}
in_stream.close();
out_stream.close();
} while (loading);
}
答案 0 :(得分:1)
主要问题是您打开同一个文件两次。一次输入,一次输出,截断文件(如果存在)。因此,当您创建out_stream
时,您将有效地删除文件中的所有数据。
如果要读取和写入同一文件,请使用std::iofstream
以读/写模式打开它。使用文本文件很难编辑文件中的数据,所以我建议您打开输出的临时文件,完成后将临时文件重命名为实际文件。
或者在你的情况下,为什么要输出文件呢?您实际上并未在任何地方使用吗?它只是截断你想要阅读的文件。