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

0

Я новичок в 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++;
     }
}

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

Теги:
string
file-io
stdvector
subscript

2 ответа

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);

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

3

Вы создали объект 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
 }
  • 0
    А ну понятно. То, что я сделал, это плохой привычка от Matlab. Большое спасибо.
  • 0
    @ user2851986: Рад помочь. Пожалуйста :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню