在将文件读入C ++中的字符串向量时,std :: vector下标超出范围

时间:2013-10-06 15:15:51

标签: c++ string file-io stdvector subscript

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

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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
 }

答案 1 :(得分: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);

它比前者更有优势,因为你可以避免潜在的重新分配(这可能使指向矢量元素的指针失效,)