我使用加载/保存选项进行了文本冒险。 在我创建游戏的文件夹中,它运行良好。即使我做了我的游戏的发布版本,它也应该如何运作。
但我必须把这个项目交给我的教授。 在我的电脑上保存和加载工作正常,但在我的笔记本电脑或我的项目文件夹的副本,我得到错误消息“缓冲区溢出已经确定”。 那我的错是什么?
我的代码加载/保存:
bool save()
{
char sFileText[1024];
char sFileName[80];
char sFileDirectory[80];
GetCurrentDirectory(512, sFileDirectory);
sprintf(sFileName, "%s\\save_game.ini", sFileDirectory);
sprintf(sFileText, "[settings]\n\rsp_loop=%i\n\rroom_iSelect=%i\n\riSelect=%i\n\rraum=%i\n\rtor402=%i\n\rwegiSelect=%i\n\rwegweiser=%i\n\rlight=%i\n\ropen_door=%i\n\rmesser=%i\n\rmesserwurf=%i\n\rkamera=%i\n\rstein=%i\n\ralive=%i\n\rpfeil=%i\n\rluke=%i\n\rkuehlschrank=%i\n\rpulver_schmand=%i\n\rteddy=%i\n\rseil=%i\n\rgiftklinge=%i\n\r",
sp_loop,
room_iSelect,
iSelect,
raum,
tor402,
wegiSelect,
wegweiser,
light,
open_door,
messer,
messerwurf,
kamera,
stein,
alive,
pfeil,
luke,
kuehlschrank,
pulver_schmand,
teddy,
seil,
giftklinge
);
int cur_char;
FILE *out_file;
out_file = fopen(sFileName, "w");
if (!out_file == NULL)
{
for (cur_char = 0; cur_char < strlen(sFileText); ++cur_char)
{
fputc(sFileText[cur_char], out_file);
}
}
else
{
return false;
}
fclose(out_file);
return true;
}
bool open()
{
char sFileText[1024];
char sFileName[12];
char sFileGameSettingsIni[80];
sprintf(sFileName, "save_game.ini");
GetCurrentDirectory(512, sFileGameSettingsIni);
sprintf(sFileGameSettingsIni, "%s\\%s", sFileGameSettingsIni, sFileName);
sp_loop = GetPrivateProfileInt("settings", "sp_loop", 512, sFileGameSettingsIni);
raum = GetPrivateProfileInt("settings", "raum", 512, sFileGameSettingsIni);
tor402 = GetPrivateProfileInt("settings", "tor402",512, sFileGameSettingsIni);
wegiSelect = GetPrivateProfileInt("settings", "wegiSelect", 512, sFileGameSettingsIni);
wegweiser = GetPrivateProfileInt("settings", "wegweiser", 512, sFileGameSettingsIni);
light = GetPrivateProfileInt("settings", "light", 512, sFileGameSettingsIni);
open_door = GetPrivateProfileInt("settings", "open_door",512, sFileGameSettingsIni);
messer = GetPrivateProfileInt("settings", "messer", 512, sFileGameSettingsIni);
messerwurf = GetPrivateProfileInt("settings", "messerwurf", 512, sFileGameSettingsIni);
kamera = GetPrivateProfileInt("settings", "kamera", 512, sFileGameSettingsIni);
stein = GetPrivateProfileInt("settings", "stein", 512,sFileGameSettingsIni);
alive = GetPrivateProfileInt("settings", "alive", 512,sFileGameSettingsIni);
pfeil = GetPrivateProfileInt("settings", "pfeil", 512, sFileGameSettingsIni);
luke = GetPrivateProfileInt("settings", "luke", 512, sFileGameSettingsIni);
kuehlschrank = GetPrivateProfileInt("settings", "kuehlschrank", 512, sFileGameSettingsIni);
pulver_schmand = GetPrivateProfileInt("settings", "pulver_schmand", 512, sFileGameSettingsIni);
teddy = GetPrivateProfileInt("settings", "teddy", 512, sFileGameSettingsIni);
seil = GetPrivateProfileInt("settings", "seil", 512, sFileGameSettingsIni);
giftklinge = GetPrivateProfileInt("settings", "giftklinge",512, sFileGameSettingsIni);
return true;
}
答案 0 :(得分:1)
可能的原因是错误地使用了GetCurrentDirectory:
char sFileDirectory[80];
GetCurrentDirectory(512, sFileDirectory);
这表示sFileDirectory
最多可以容纳512个字符:它最多只能容纳80个字符(包括NULL终止符),因此可以轻松写入sFileDirectory
的结尾。
更改为:
GetCurrentDirectory(sizeof(sFileDirectory) - 1, sFileDirectory); /* Check the return value. */
由于当前目录较短,它可能在您的PC上运行,在不同的PC上,它可以存储在路径大于79个字符的目录中。
另一个问题是:
char sFileName[12];
sprintf(sFileName, "save_game.ini");
“save_game.ini”长度为13个字符。 改为:
char sFileName[14];
sprintf(sFileName, "save_game.ini");
或:
const char* sFileName = "save_game.ini";
另请考虑使用_snprintf代替sprintf
。
答案 1 :(得分:1)
您将sFileName
定义为sFileName[12]
,然后尝试向其写入14个字节(13和NULL)。它看起来像你传递给GetCurrentDirectory()
的缓冲区还不够大。当你只将它定义为80个字符宽时,你说明缓冲区的长度是512个字节。
GetCurrentDirectory()
的返回值将告知您缓冲区需要多大。
答案 2 :(得分:0)
sFileDirectory与GetCurrentDirectory的缓冲区大小相比,它非常小。尝试enlanrge适合相同的大小。它在发布机器上可能有所不同。