我使用 Visual C++ 2008 express 为基于文本的 RPG 游戏制作了三个文件。在我真正深入了解整个事情之前,我想先搞清楚基础知识:新游戏、保存游戏、继续游戏、退出游戏。到目前为止,我已经完成了制作角色部分(在这种情况下找到武器)并退出游戏。我坚持如何将武器统计数据从结构传递到保存文件。我似乎毫无问题地传递了结构的成员并检查文件以找到“垃圾”:Ì 和 -858993460 代替我的值。
我应该如何修复我的 save_game 和 continue_game 功能?我做了很多研究试图弄清楚这一点,但我尝试过的任何东西似乎都没有帮助。
这是代码的重要部分:
struct player_character
{
char type;
int damage;
int stability;
};
void save_game(player_character& pc, ofstream &save);
void continue_game(player_character& pc, ifstream &get);
int main()
{
player_character pc;
ofstream save;
ifstream get;
//rest of main() goes here.
//pause screen
system("pause");
return 0;
}
//rest of functions go here.
void save_game(player_character &pc, ofstream &save_data)
{
save_data.open ("save.dat", ios::binary);
if (save_data.is_open())
{
save_data << "pc.type = " << pc.type << endl;
save_data << "pc.damage = " << pc.damage << endl;
save_data << "pc.stability = " << pc.stability << endl;
//doesn't work
//save_data.write(reinterpret_cast<char*>(&pc), sizeof(pc));
save_data.close();
}
else
{
cout << " Error. Unable to open file.";
}
}
void continue_game(player_character &pc, ifstream &get_data)
{
get_data.open("save.dat");
if (get_data.is_open())
{
//doesn't work
//get.read(reinterpret_cast<char*>(&pc), sizeof(pc));
get.close();
}
else
{
cout << " Error. Unable to open file.";
}
}
感谢您的回复。我正在尝试以下修订。continue_game 功能似乎可以工作。我没有收到任何错误(还)。当我在创建一个字符后选择保存时,我收到以下错误:Undone.exe 中 0x69197a28 处的未处理异常:0xC0000005:访问冲突读取位置 0xffffffcc。
谷歌将其显示为某种 Windows 问题。
为什么我的函数会导致此错误?
void save_game(ofstream &save, player_character const &pc)
{
save.open ("save.dat");
if (save.is_open())
{
save.write(reinterpret_cast<char const *>(pc.type), sizeof pc.type);
save.write(reinterpret_cast<char const *>(pc.damage), sizeof pc.damage);
save.write(reinterpret_cast<char const *>(pc.stability), sizeof pc.stability);
save.close();
}
else
{
cout << " Error. Unable to open file.";
}
}
int continue_game(ifstream &get)
{
if (!get.read(reinterpret_cast<char *>(&pc.type), sizeof pc.type)) { /* error */ }
if (!get.read(reinterpret_cast<char *>(&pc.damage), sizeof pc.damage)) { /* error */ }
if (!get.read(reinterpret_cast<char *>(&pc.stability), sizeof pc.stability)) { /* error */ }
return pc.type;
return pc.damage;
return pc.stability;
}
我已更改 save_game 和 continue_game 代码并将其包含在此处。我还收集了调试器和汽车输出(汽车的小版本,不是全部七页)。显然我的值没有在 save_game 中进行评估,所以 continue_game 没有什么可使用的,也不会导致错误。
这是代码和调试器/自动打印输出:
int save_game(ofstream &save, player_character& pc)
{
save.open ("save.dat", ios::binary);
if (save.is_open())
{
//the error hits here:
save.write(reinterpret_cast<char const *>(pc.type), sizeof pc.type);
save.write(reinterpret_cast<char const *>(pc.damage), sizeof pc.damage);
save.write(reinterpret_cast<char const *>(pc.stability), sizeof pc.stability);
save.close();
}
else
{
cout << " Error. Unable to open file.";
}
return pc.type;
return pc.damage;
return pc.stability;
}
int continue_game(ifstream &get, player_character& pc)
{
get.open ("save.dat", ios::binary);
if (get.is_open())
{
if (!get.read(reinterpret_cast<char *>(&pc.type), sizeof pc.type)) { /* error */ }
if (!get.read(reinterpret_cast<char *>(&pc.damage), sizeof pc.damage)) { /* error */ }
if (!get.read(reinterpret_cast<char *>(&pc.stability), sizeof pc.stability)) { /* error */ }
get.close();
}
else
{
cout << " Error. Unable to open file.";
}
return pc.type;
return pc.damage;
return pc.stability;
}
调试器输出窗口:Undone.exe 中 0x644e7a28 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xffffffcc。Undone.exe 中 0x644e7a28 处的未处理异常:0xC0000005:访问冲突读取位置 0xffffffcc。
自动: - pc {type='Ì' 伤害=-858993460 稳定性=-858993460 } player_character & type -52 'Ì' char 伤害 -858993460 int 稳定性 -858993460 int pc.type -52 'Ì' char - 保存 {_Filebuffer= {...} } std::basic_ofstream > & + std::basic_ostream > {...} std::basic_ostream > + _Filebuffer {_Pcvt=0x00000000 _Mychar='Ì' _Wrotesome=false ...} std::basic_filebuf >
好吧,我已经设法取得了一些进展。我发现我需要将参数放入我的 main_menu 函数(请注意,我不是在讨论 main() 函数,而是我创建的一个),以便将它们传递给我的 save_game 函数。我还可以通过在我的写入函数中添加一个 & 来停止访问错误。所以这:
save.write(reinterpret_cast<char const *>(&pc.type), sizeof pc.type);
save.write(reinterpret_cast<char const *>(&pc.damage), sizeof pc.damage);
save.write(reinterpret_cast<char const *>(&pc.stability), sizeof pc.stability);
代替:
save.write(reinterpret_cast<char const *>(pc.type), sizeof pc.type);
save.write(reinterpret_cast<char const *>(pc.damage), sizeof pc.damage);
save.write(reinterpret_cast<char const *>(pc.stability), sizeof pc.stability);
savve_game 代码在将数据放入文件时仍然无法正常工作,但它会打印到屏幕上。