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++;
     }
}

任何帮助将不胜感激。

4

2 回答 2

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
 }
于 2013-10-06T15:17:20.220 回答
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);

与前者相比,它具有优势,因为您可以避免潜在的重新分配(这可能会使指向向量元素的指针无效,即)

于 2013-10-06T15:22:38.597 回答