istream — обработка исключения std :: out_of_range переполнение стека

Я пытаюсь прочитать расписание рейсов из файла в Flight учебный класс.

Я столкнулся с проблемой при использовании Microsoft Visual Studio 2015. Я пытался с тем же кодом на tutorialspoint c ++ онлайн компилятор и все отлично работает.

Вот пример данных текстового файла:

LAS VEGAS; 21:15; AA223; A3;
DALLAS; 21:00; BA036; A3;
LONDON; 20:30; AA220; B4;
MEXICO; 19:00; VI303; B4;
LONDON; 17:45; BA087; B4;

Вот сообщение об ошибке, которое я получаю:

Необработанное исключение в 0x75F25B68 в sf.exe: исключение Microsoft C ++: std :: out_of_range в расположении памяти 0x00C5EE9C.

А вот потоковый экстрактор, в котором проблема по-видимому возникает

istream &operator>>(istream &is, Flight &f) {
std::string singleLine;
is >> singleLine;
std::string s0, s1, s2, s3;
size_t loc = singleLine.find(';');
s0 = singleLine.substr(0, loc);
singleLine.erase(0, loc + 1);
loc = singleLine.find(';');
s1 = singleLine.substr(1, loc - 1);
singleLine.erase(0, loc + 1);
loc = singleLine.find(';');
s2 = singleLine.substr(1, loc - 1);
singleLine.erase(0, loc + 1);
s3 = singleLine.substr(1, 2);f.set_lightNo(s0);
f.set_destination(s1);
f.set_departure(s2);
f.set_gateNo(s3);
return is;
}

0

Решение

Проблема в том, что вы читаете строки с:

is >> singleLine;  // <== ouch !

singleLine будет заканчиваться первым пробелом и не будет содержать всю строку!

В данных вашего примера первый пробел находится сразу после первого ;, Итак, когда вы делаете второй find(';')возвращаемое значение не будет найдено, т.е. string::npos, что является максимальным loc может содержать (очень большое число). Когда вы затем пытаетесь получить доступ к substr(1, loc - 1) Вы определенно вне диапазона.

Это должно работать, если вы замените строку на:

getline (is, singleLine); // will get the full line until nweline or eof

Предложение:

Еще одним улучшением будет проверка успешности чтения перед чем-либо еще:

istream &operator>>(istream &is, Flight &f) {
std::string singleLine;
if (getline (is, singleLine)) {
...
}
return is;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]