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 に答える