从先前保存的文件加载时缓冲区溢出

时间:2012-01-11 22:17:33

标签: c load save ini

我使用加载/保存选项进行了文本冒险。 在我创建游戏的文件夹中,它运行良好。即使我做了我的游戏的发布版本,它也应该如何运作。

但我必须把这个项目交给我的教授。 在我的电脑上保存和加载工作正常,但在我的笔记本电脑或我的项目文件夹的副本,我得到错误消息“缓冲区溢出已经确定”。 那我的错是什么?

我的代码加载/保存:

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;
}

3 个答案:

答案 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适合相同的大小。它在发布机器上可能有所不同。