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())是一种反模式,它是一个错误的常见来源。原因是它true仅在尝试读取文件末尾之后才返回。这意味着您获得了太多的迭代,太多的迭代,x++并且您超出了 in 的范围data[x],调用了未定义的行为。

有时。不幸的是,您可能会侥幸逃脱并且它似乎可以工作。

将循环更改为

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

看看它是否有所作为。

(请注意,上面的代码不考虑少于 9 行的输入。另外,我建议您使用 astd::vector而不是 C 数组。)

于 2013-10-14T12:09:00.673 回答