2012-01-11 76 views
0

我使用加載/保存選項進行了文本冒險。 在我創建遊戲的文件夾中,它工作正常。即使我做了我的遊戲的發行版本,它也是如此。從以前保存的文件加載時緩衝區溢出

但我必須把這個項目交給我的教授。 在我的電腦上,保存和加載工作正常,但在我的筆記本電腦或我的項目文件夾的副本上,我收到errormessage「緩衝區溢出已滿足」。 那麼我的錯在這裏?

我的代碼加載/保存:

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

應該被標記爲C而不是C++我認爲。可能需要更多的代碼。 – matiu 2012-01-11 22:20:10

回答

1

您將sFileName定義爲sFileName[12],然後嘗試向其寫入14個字節(13和NULL)。它也看起來像你傳遞給GetCurrentDirectory()的緩衝區不夠大。您聲明緩衝區的長度爲512個字節,當您只將其定義爲80個字符寬時。

返回值GetCurrentDirectory()會告訴您緩衝區需要多大。

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

+0

我找到了一個簡單的解決方案。 – 2012-01-11 22:44:02

0

sFileDirectory與GetCurrentDirectory的緩衝區大小相比,它非常小。嘗試着去適應相同的尺寸。在發佈機器上可能不同。

+0

我發現了一個非常簡單的解決方案... ,而不是寫sFileName [12]; 我寫了 sFileName [] =「save_game.ini」; 現在,這工作正常! Thx非常重要! – 2012-01-11 22:44:17