C ++ vector :: _ M_range_check Ошибка?

Вот моя функция:

void loadfromfile(string fn, vector<string>& file){
int x = 0;
ifstream text(fn.c_str());
while(text.good()){
getline(text, file.at(x));
x++;
}
//cout << fn << endl;
}

Значение fn, которое я передаю, это просто имя текстового файла (’10a.txt’)
Значение файла, который я передаю, объявляется следующим образом:

vector<string> file1;

Причина, по которой я не определил размер, заключается в том, что я не думал, что мне нужно с векторами, они динамические … не так ли?

Эта функция предназначена для чтения заданного текстового файла и сохранения полного содержимого каждой строки в одной векторной ячейке.

Ex. Сохраните содержимое первой строки в file.at (0)
Сохраните содержимое второй строки в file.at (1)
И так до тех пор, пока в текстовом файле не останется больше строк.

Ошибка:

прекращение вызова после выброса экземпляра ‘std :: out_of_range’
что (): vector :: _ M_range_check

Я думал, что проверка в цикле while должна предотвратить эту ошибку!

Заранее спасибо за помощь.

8

Решение

вектор file пустой, file.at(x) выбросит из диапазона исключение. Тебе нужно станд :: вектор :: push_back Вот:

std::string line;
while(std::getline(text, line))
{
file.push_back(line);
}

Или вы можете просто построить вектор строки из файла:

std::vector<std::string> lines((std::istream_iterator<std::string>(fn.c_str())),
std::istream_iterator<std::string>());
3

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

file.at(x) обращается к элементу в x-й позиции, но он должен существовать, он не создается автоматически, если его нет. Чтобы добавить элементы в ваш вектор, вы должны использовать push_back или же insert, Например:

file.push_back(std::string()); // add a new blank string
getline(text, file.back());    // get line and store it in the last element of the vector
0

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