Я новичок в 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++;
}
}
Любая помощь будет оценена.
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);
который имеет преимущество перед первым, так как вы можете избежать потенциального перераспределения (что может сделать недействительными указатели на векторные элементы, т.е.
Вы построили 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
}