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