Вектор нижний индекс вне диапазона. Строка 1140. Переполнение стека

Я читаю в файле, который является пулом вопросов, который имеет тип вопроса, главу, сколько очков это стоит, вопрос и ответ. Этот бит кода проверяет, находятся ли минимальная и максимальная главы (из пользовательского ввода) в диапазоне (из файла неизвестного размера). Я знаю, что он добавляет дополнительную строку в конце вектора, что вызывает ошибку, но как я могу это исправить? Код является:

void checker(int min, int max, string file) {

ifstream myfile;
string line;
vector<int> numlist;

myfile.open(file);
while (myfile.is_open()) {
if (!getline(myfile, line)) {
break;
} else {
vector<string> chap = split_string(line);
int chapter = str2int(chap[2]);
numlist.push_back(chapter); //This is where the error is. Makes vector go out of range.
}
}

int small = 1000;
int large = 0;
for (size_t i = 0; i < numlist.size(); i++) {
if (numlist[i] < small) {
small = numlist[i];
}
}
for (size_t i = 0; i < numlist.size(); i++) {
if (numlist[i] > large) {
large = numlist[i];
}
}
if (min > max) {
cout
<< "Error: Please enter a number lower than or equal to the maximum chapter: "<< endl;
cin >> min;
cout << endl;
} else if (min < small) {
cout
<< "Error: Please enter a number bigger than or equal than the minimum chapter ("<< small << "): " << endl;
cin >> min;
cout << endl;
} else if (max > large) {
cout
<< "Error: Please enter a number bigger than or equal than the maximum chapter ("<< large << "): " << endl;
cin >> max;
cout << endl;
}
myfile.close();
}

-2

Решение

Это говорит вам о том, что «глава» не имеет 3 элементов:

str2int(chap[2]);

Вы должны запустить под отладчиком, чтобы увидеть, как выглядит глава, если вы используете Visual Studio, нажмите F11, чтобы войти в main.

— Редактировать —

это появляется быть вашим кодом проблемы:

            vector<string> chap = split_string(line);
int chapter = str2int(chap[2]);

если split_string возвращает вектор с менее чем 3 элементами, строка

            int chapter = str2int(chap[2]);

является недействительным. Исполняемый файл будет неверно сообщать точное место сбоя, когда вы запускаете исполняемый файл вне отладчика из-за того, как реализованы проверки.

Что вам нужно сделать, это:

std::vector<std::string> chap = split_string(line);
if(chap.size() > 2) {
int chapter = str2int(chap[2]);
numlist.push_back(chapter);
}

или возможно

if (!line.empty()) {
std::vector<std::string> chap = split_string(line);
if (chap.size() > 2) {
int chapter = str2int(chap[2]);
numlist.push_back(chapter);
}
}
0

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

void checker(int min, int max, string file) {

ifstream myfile;
string line;
vector<int> numlist;

myfile.open(file);
while (!myfile.eof()) {
if (!getline(myfile, line)) {
break;
} else if(line!="") {
vector<string> chap = split_string(line);
int chapter = str2int(chap[2]);
numlist.push_back(chapter);
}
}
//other code cut out because it was not important

Я просто включил этот код с моим назначением, и это сработало! chap [2] — это третий элемент строки из файла, который был прочитан. В файле есть много строк, которые (с помощью других функций и классов) были превращены в их собственный вектор. Но третьим элементом каждого вектора (строка, считанная из файла) был номер, который был номером главы (глава [2]). Теперь это доказывает, что глава [2] НЕ БЫЛО виновник.
Вот пример строки из файла:
short @ 1 @ 10 @ В наследовании, что такое технический термин для родительского класса? @base class

0

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