2012-01-11 15 views
0

ロード/保存オプションを使用してテキストアドベンチャーを作成しました。 私はゲームを作成したフォルダでうまくいきました。そして、たとえ私が自分のゲームのリリース版を出しても、それはどのようにして動作するのですか?前の保存ファイルからロードするときにバッファオーバーランが発生する

しかし私はこのプロジェクトを教授に与えなければなりません。 私のPCで保存と読み込みは正常に動作しますが、ノートパソコンやプロジェクトフォルダのコピーでは、 "バッファオーバーランが発生しました"というエラーメッセージが表示されます。 ここに私の欠点は何ですか?

マイコードはセーブ/ロードする:

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

答えて

1

sFileNamesFileName[12]と定義し、14バイト(13とNULL)を書き込もうとします。 GetCurrentDirectory()に渡すバッファが十分に大きくないように見えます。あなたは80バイトの文字列として定義しただけで、バッファの長さは512バイトです。

戻り値がGetCurrentDirectory()の場合、バッファの大きさを通知します。

1

考えられる原因はGetCurrentDirectoryの誤った使用である:

char sFileDirectory[80]; 

GetCurrentDirectory(512, sFileDirectory); 

これはsFileDirectoryは、512文字の最大を保持できることを述べている:それは保持することができます最大で80(NULLターミネータを含む)だけなので、これはsFileDirectoryの終わりを超えて簡単に書き込むことができます。

変更するには:

GetCurrentDirectory(sizeof(sFileDirectory) - 1, sFileDirectory); /* Check the return value. */ 

それが原因別のPC上でそれが79文字を超えるパスでディレクトリに格納することができ短く、現在のディレクトリにあなたのPC上で動作する可能性があります。

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

私は簡単な解決策を見つけました。 –

0

sFileDirectory GetCurrentDirectoryのバッファサイズに比べてかなり小さいです。同じサイズに合わせて拡大しようとする。リリースマシンではおそらく異なるでしょう。

+0

私はかなり簡単な解決策を見つけました... sFileName [12]; は書きました sFileName [] = "save_game.ini"; これでうまくいきます! Thxは全然ありません! –

関連する問題