2016-05-29 22 views
-1

私は本当にここで助けていただきたいと思います。入力ファイルのテキストを使用して、文字列ベクトルのベクトルを入力する必要があります。どうやって始めたらいいのか分かりません。入力ファイルからの文字列ベクトルのベクトルを埋めてください

私はこの言葉を読むために関数にこのようなものを持っていますが、私は文字列をプッシュできないというコンパイラエラーを受けているので、間違ったトラックにいることがわかります。どんな助けも非常に高く評価されるでしょう。

ifstream input(filename); 

for (int i = 0; i < 4; i++) 
{ 

    for (int j = 0; j < 4; j++) 
    { 
    string line; 
    getline(input, line); 
    stringstream temp(line); 
    string tempWord; 
    temp >> tempWord; 
    words[i][j].push_back(tempWord); 
    } 
+1

「words [i] [j] = tempWord; '? – songyuanyao

+0

「言葉」はどうやって宣言しましたか? –

+0

これは、>という単語で宣言されています。いくつかの言葉で試して読むために私が使用している関数への参照によって渡されます。 – zettaucla

答えて

0

言葉がvector<vector<string>>であれば、words[i][j]stringにアクセスしています。あなたが探しているのはwords[i][j] = tempWord;です。 stringもまた.push_back()の機能を持っていますが、charが表示されます。その理由は、文字列をpush_backすることができないということです。stringの文字列に文字を追加するのはpush_back()です。また、wordsを宣言した方法によっては、サイズを指定しなかった場合はwords[i][j]が範囲外にアクセスしている可能性があり、より良い方法はwords[i].push_back(tempWord)です。あなたのforループを見ると、あなたが望むファイルからどの単語が出てくるのかはわかりませんが、コードの最初の16行を読み込み、それぞれから最初の "単語"を挿入しますwordsオブジェクトです。あなたの意図が代わりに文字列のベクトルのベクトルを持つのであれば、各サブベクトルは行内の単語であり、以下のようなものが良いかもしれません。

#include <iostream> 
#include <fstream> 
#include <string> 
#include <sstream> 
#include <vector> 


int main(int argc, char* argv[]) 
{ 
    std::string filename = "testfile.txt"; 
    std::ifstream input(filename.c_str()); 
    if(!input){ 
     std::cerr << "Error in opening file: " << filename << "\n"; 
     return 1; 
    } 
    std::vector<std::vector<std::string> > words; 
    std::string line; 

    while(std::getline(input, line)){ 
     std::stringstream ss; 
     ss << line; 
     std::vector<std::string> row; 
     while (!ss.eof()) { 
      std::string tempStr; 
      ss >> tempStr; 
      row.push_back(tempStr); 
     } 
     words.push_back(row); 
    } 
    //... then do something with words here 
    return 0; 
} 
+0

ありがとうございました。私は実際にどのように起動するのか分かりませんでした。私のプログラムはクラッシュし続けました。私のforループが台無しになったからです。あなたは正しい、私は単語の行/文としてサブベクトルを持っているようにしようとしていた。また、どのようにしてさまざまな言葉にアクセスできますか? forループ? – zettaucla

+0

'words [0] [0]'は最初の行の最初の単語にアクセスし、 'words [0] [1]'は最初の行の2番目の単語にアクセスします。範囲外にアクセスしていないと、words.size()は行数を返し、words [0] .size()は最初の行の単語数などを返します。範囲チェックで要素にアクセスするので、最初の行 'words.at(0).at(0)'に最初の単語があります。あなたが 'words.at(5).at(0)'を実行し、ファイルに6行もなかった場合は、std :: out_of_range例外が出ますが、 'words [5] [0]'例外が発生するだけです。 –

関連する問題