0

私のプロジェクトでは、保存ファイルリーダーを作成しています。最新のビルドで実行時エラーが発生しますUnhandled exception at 0x00075256 in Final Assessment.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.

このエラーの原因を特定して修正するにはどうすればよいですか?

ifstream オブジェクトを作成するとエラーが発生すると思いますがsaveFile()、正確なソースを見つけることができませんでした。

bool Game::load(){
    string data[9];
    ifstream saveFile("save.dat");
    int x = 0;
    if (saveFile.is_open()){
        while (!saveFile.eof()){
            getline(saveFile,data[x]);
            x++;
        }
        saveFile.close();

        string savePlayerName = data[0];
        int saveBaseHealth = stringToInt(data[1]);
        int saveHealth = stringToInt(data[2]);
        int saveKilled = stringToInt(data[3]);
        int saveMoney = stringToInt(data[4]);

        string saveWeaponName = data[5];;
        int saveAttack = stringToInt(data[6]);

        string saveArmorName = data[7];
        int saveDefense = stringToInt(data[8]);

        mainPlayer.setName(savePlayerName);
        mainPlayer.setBaseHealth(saveBaseHealth);
        mainPlayer.setHealth(saveHealth);
        mainPlayer.setEnemiesKilled(saveKilled);
        mainPlayer.setMoney(saveMoney);

        mainWeapon.setName(saveWeaponName);
        mainWeapon.setAttackPower(saveAttack);

        mainArmor.setName(saveArmorName);
        mainArmor.setDefense(saveDefense);
        return true;
    }
    else
    {
        return false;
    }
}

デバッグ

4

1 に答える 1

8

クラッシュの直接の理由ではないかもしれませんが、次のようになります。

while (!saveFile.eof())は、off-by-one エラーの一般的な原因となるアンチパターンです。その理由はtrue、ファイルの終わりを超えて読み取ろうとした後にのみ返されるためです。つまり、反復が 1 回多すぎると、x++の範囲を超えてdata[x]、未定義の動作が呼び出されます。

時々。残念ながら、あなたはそれでうまくいくかもしれませんが、うまくいくように見えます.

ループを次のように変更します

while (getline(saveFile, tempString) && x < 9) {
    data[x] = temp;
    ++x;
}

そして、それが違いを生むかどうかを確認してください。

(上記のコードは 9 行未満の入力を考慮していません。注意してください。また、std::vectorC 配列の代わりに a を使用することをお勧めします。)

于 2013-10-14T12:09:00.673 に答える