2017-03-05 2 views
-1

ファイルを列単位で読み込もうとしています。主な機能は、私のファイルは列のすべての値を表示する必要があります。 私はベクトルでやろうとしています。テキストファイルを列で読み込み、すべての列値の配列を表示します。

void search(){ 
const int COLUMNS = 4; 

    vector< vector <int> > data; 

    string filename = "bla.txt"; 

    ifstream ifile(filename.c_str()); 


    if (ifile.is_open()) { 
     int num; 

     vector <int> numbers_in_line; 

     while (ifile >> num) { 
      numbers_in_line.push_back(num); 

      if (numbers_in_line.size() == COLUMNS) { 
       data.push_back(numbers_in_line); 
       numbers_in_line.clear(); 
      } 
     } 
    } 
    else { 
     cerr << "There was an error opening the input file!\n"; 
     exit(1); 
    } 

    //now get the column from the 2d vector: 
    vector <int> column; 
    int col = 2;//example: the 2nd column 

    for (int i = 0; i < data.size(); ++i) { 
     column.push_back(data[i][col - 1]); 
     cout << column[i] << endl; 
    } 

    ifile.close(); 
} 

私のファイルのようになります。

John 1990 1.90 1 
Peter 1980 1.88 0 
... 

このコードはコンパイルが、私は、コンソールに示す任意の値を取得しておりません。最後の行をデバッグしようとするとキャッシュされませんので、何もしないと思いますか?

+0

あなたは 'ベクトル'の中に 'John'と' Peter'を格納しようとしていますが、ifstreamの失敗ビットがセットされています。 'data.size()'が0に等しいので、何も出力されません。 – user

+0

どのようにマルチタイプのベクトルにするには? – NotsoPr0

+0

@ NotsoPr0:これはまったく異なる質問です。したがって、ここで新しい質問をするか、既存の質問を検索する必要があります。ヒント: 'boost :: any'のようなものが役に立ちます。 –

答えて

2
while (ifile >> num) { 

numintであり、入力線の第一要素はintとして解釈することができない、Johnので、ifileがエラー状態に設定されているため、ループが入力されることはありませんループ状態は直ちに偽である。

完全な修正は、最初にstd::getlineで行全体を読み取ってから、結果としてstd::stringをトークン化します(例:std::istringstream)。

トークン化から得られる個々のstd::stringトークンは、std::stoiのような機能を持つ適切なタイプに変換できます。

1

ステップバイステップで、各ステップが正しいことを確認してください。

  1. 各行を読み、正しく印刷していることを確認してください。
  2. 各行を分割する必要があります。この手順の後、John、1990などを文字列として使用します。 My favorite split method
  3. 2〜4番目の列を整数に変換します。

簡単に見つけることができる各手順には、優れた解決策があります。

+0

私はちょっと混乱しています、その3ステップを作る方法。列に分割する方法。多分あなたは私にいくつかのヒントを示すことができますか? – NotsoPr0

+1

*あなたのリストを* code *と誤ってマークしているのはなぜですか? –

+1

@ChristianHackl、それを更新しました。ありがとうございました – smttsp

関連する問題