Для моего проекта я пишу файл для чтения файлов. В последней сборке я получаю ошибку времени выполнения Unhandled exception at 0x00075256 in Final Assessment.exe: 0xC0000005: Access violation writing location 0xCCCCCCCC.
Как я могу найти и исправить источник этой ошибки?
Я считаю, что ошибка возникает, когда я создаю объект 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;
}
}
Возможно, это не причина вашей аварии, но здесь идет:
while (!saveFile.eof())
- это анти-шаблон, который является общим источником ошибок "один за другим". Причина в том, что он возвращает true
только после того, как делается попытка прочесть конец файла. Это означает, что вы слишком много используете одну итерацию, один x++
слишком много, и вы выходите за границы в data[x]
, вызывая неопределенное поведение.
Иногда. К сожалению, вы можете уйти от него, и он, похоже, сработает.
Измените цикл на
while (getline(saveFile, tempString) && x < 9) {
data[x] = temp;
++x;
}
и посмотреть, не изменилось ли это.
(Приведенный выше код не учитывает ввод с менее чем 9 строк, заметьте. Кроме того, я бы предложил использовать std::vector
вместо C-массива.)