нижний индекс std :: vector вне диапазона при чтении файла в вектор строк в переполнении стека

Я новичок в C ++. Я быстро учусь, но пока мало что знаю.

Я не вижу проблемы с индексом в этой функции:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

void get_rows(string filepath, vector<string> &rows);

int main() {
vector<string> rows;
get_rows("ninja.txt", rows);

for (int i = 0; i < rows.size(); i++) {
cout << rows[i] << endl;
}
}

void get_rows(string filepath, vector<string> &rows) {

ifstream file;
file.open(filepath);

string str;
int index = 0;

while (!file.eof()) {

getline(file, str);
rows[index] = str;
index++;
}
}

Любая помощь будет оценена.

0

Решение

vector<string> rows;
^
size() is 0
get_rows("ninja.txt", rows);

void get_rows(string filepath, vector<string> &rows) {
//...
int index = 0;
rows[index] = str; // but there is no rows[0] yet
//...
}

вы должны либо использовать push_back добавить новые элементы в vector или создать vector с указанным размером в начале (если он известен)

vector<string> rows(160);

который имеет преимущество перед первым, так как вы можете избежать потенциального перераспределения (что может сделать недействительными указатели на векторные элементы, т.е.

0

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

Вы построили std::vector<string> объект:

vector<string> rows;

а затем позже вы пытаетесь получить доступ к его элементам, хотя в этом векторе еще нет элементов:

rows[index] = str;

Вы должны вставить новые элементы в вектор, используя push_back метод:

rows.push_back(str);

Также обратите внимание, что с помощью while (!file.eof()) неправильно, потому что getline может произойти сбой внутри цикла:

 while (!file.eof()) {
getline(file, str);
...
}

Ваш цикл должен выглядеть следующим образом:

 while (std::getline(file, str)) {
if (str.empty()) continue;        // we skip empty lines
rows.push_back(str);              // and push non-empty lines at the end
}
3

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