ОБНОВИТЬ
Я думал, что stoi(string) решил эту проблему, но это сработало ненадолго. Я добавил код для splitString и расшифровал его ниже.
Время от времени я получаю необработанные исключения с atoi(), используя одно и то же предполагаемое значение.
Мой код выглядит так:
ifstream myfile ("Save.sav");
string line = "";
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
}
myfile.close();
line = StaticFunctions::decrypt(line);
}
vector<string> splitString = StaticFunctions::splitString(line, 's');
return atoi(splitString[0].c_str());
Итак, что он делает, так это читает файл сохранения, затем расшифровывает его, а затем разбивает строку на каждую «s». Когда я отлаживаю, файл сохранения всегда один и тот же, а первое значение равно 3.
Это работает иногда, может быть, каждые 10 попыток. Итак, каждые 9 из 10 попыток я получаю необработанное исключение в... в ячейке памяти.
Мониторинг преобразованного значения показывает, что оно всегда возвращает 3, а затем приложение не падает, пока я не запущу игру, которая находится немного дальше в коде.
Если я удалю atoi и просто верну 3, приложение работает нормально.
Я пробовал strtod, но это не помогло.
Спасибо,
- Маркус
Код разделения строки:
vector<string> StaticFunctions::splitString(string str, char splitByThis)
{
vector<string> tempVector;
unsigned int pos = str.find(splitByThis);
unsigned int initialPos = 0;
// Decompose statement
while( pos != std::string::npos ) {
tempVector.push_back(str.substr( initialPos, pos - initialPos + 1 ) );
initialPos = pos + 1;
pos = str.find(splitByThis, initialPos );
}
// Add the last one
tempVector.push_back(str.substr(initialPos, std::min(pos, str.size()) - initialPos + 1));
return tempVector;
}
Расшифровать код (очень просто):
string StaticFunctions::decrypt(string decryptThis)
{
for(int x = 0; x < decryptThis.length(); x++)
{
switch(decryptThis[x])
{
case '*':
{
decryptThis[x] = '0';
break;
}
case '?':
{
decryptThis[x] = '1';
break;
}
case '!':
{
decryptThis[x] = '2';
break;
}
case '=':
{
decryptThis[x] = '3';
break;
}
case '#':
{
decryptThis[x] = '4';
break;
}
case '^':
{
decryptThis[x] = '5';
break;
}
case '%':
{
decryptThis[x] = '6';
break;
}
case '+':
{
decryptThis[x] = '7';
break;
}
case '-':
{
decryptThis[x] = '8';
break;
}
case '"':
{
decryptThis[x] = '9';
break;
}
}
}
return decryptThis;
}
line
с помощьюstring line = "";
; простоstring line;
создаст пустую строку. - person Gorpik   schedule 26.09.2012StaticFunctions::splitString()
? - person hmjd   schedule 26.09.2012StaticFunctions::splitString
иStaticFunctions::decrypt
? Может быть, они испортили строки, которые вы позже обрабатываете с помощьюatoi
? - person Zdeslav Vojkovic   schedule 26.09.2012std::string
вместоconst char*
). Если вы перепутаете строки, он выдаст либоinvalid argument
(если строку нельзя преобразовать в целое число), либоout_of_range
(если целое число, представленное строкой, слишком велико). По крайней мере, вы будете знать, что не так. - person Cubic   schedule 26.09.2012good
для проверки зацикливания, вместо этого сделайте, например.while (std::getline(...))
. - person Some programmer dude   schedule 26.09.2012