2012-09-02 32 views
6

申し訳ありませんが、私には解決策が見つからないようです。私は、テキストファイルからデータを読み込み、最終的にオブジェクトに格納しようとしています。ファイルからCSVデータを読み取る

テキストファイルには、4つの変数がすべてカンマで区切られています。

string v1, v2, v3, v4; 
ifstream afile; 
afile.open("thefile.txt"); 
afile >> v1 >> v2 >> v3 >> v4; 
afile.close(); 
cout << v1 << endl; 
cout << v2 << endl; 
cout << v3 << endl; 
cout << v4 << endl; 

ファイルに複数のレコードを持って次のように

私はこれを行うにしようとしました。私はちょうどそれが動作することを確認するために今のところ1をしようとしましたが、データを読み込むときに、コンマで区切られません。

そこから、データをオブジェクトに保存したいと思います。次の仕事がありますか: 事* thing1 =新しいもの(v1、v2、v3、v4);

5つのレコードを読み込むと、上記のコード行を構成するにはどうすればよいでしょうか?それぞれのオブジェクトは一意の名前を必要とするので、おそらくforループとベクトルを使用して反復できる方法はありますか?すなわち 用は、(i = 0、int型、I < 5; iが++){ //ベクトル データ //ストア内に読み込ま}

を任意のヒントは非常に

+0

[カンマ区切りの値でテキストファイルに読み書きする方法](http://stackoverflow.com/questions/1474790/how-to-read-write-into-from-text-file)コンマ区切り値付き) –

答えて

8

CSV形式はより複雑であると理解されていますコンマ区切り記号だけではありません。それに応じてエスケープして解釈する引用符を含めることができ、さまざまな区切り文字を使用できます。入力ファイルが厳密にフォーマットされていない場合は、専用のCSVインポート/エクスポートライブラリを使用する必要があります。

トークナイザークラスが質問に答えます(boostまたはsimpler onesのようなものがあります)。

この件についてはotherquestionsをご確認ください。

6

お手数ですが、@Soravuxとお答えします。特に、彼が提案するstrtkツールキットは興味深いようで、単なるヘッダーです。 Boostは、少なくとも5つの異なる方法でそれを行うこともできます。また、C++をしばらく使用する場合は、学習価値のあるライブラリです。つまり、これらのソリューションはすべてあなたのプログラムに複雑さを加えるでしょう。そして、あなたが必要とするのは非常に簡単なナンバーリーダーであれば、他のどこかでその努力を費やしたいと思う可能性があります。ここでは、標準C++(STLと、例えば、ベクトルおよびストリーム)に行く方法です:

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

    using namespace std; 

    vector<double> &split(const string &s, 
     char delim, vector<double> &elems) 
    { 
     stringstream ss(s); 
     string item; 
     while (std::getline(ss, item, delim)) { 
      stringstream conv(item); 
      double number; 
      conv >> number; 
      elems.push_back(number); 
     } 
     return elems; 
    } 

    struct my_record_t{ 
     double f1, f2, f3, f4; 
    }; 

    typedef vector<my_record_t> my_record_vector_t; 

    int main(int argc, char* argv[]) 
    { 
     stringstream in("10,20,2.0,5\n" 
          "4.,5.,6.,80\n" 
          "4.,2.,6.,70\n" 
          "4.,5.,6.,86\n" 
          "2.,5.,9.,80\n"); 
     // Or alternatively, : 
     // ifstream in("myfile.csv"); 

     // Here you store your records 
     my_record_vector_t mrv; 

     string line; 
     vector<double> numbers; 
     while(std::getline(in, line, '\n')) 
     { 
      numbers.clear(); 
      split(line, ',', numbers); 
      my_record_t r; 
      r.f1 = numbers[0]; 
      r.f2 = numbers[1]; 
      r.f3 = numbers[2]; 
      r.f4 = numbers[3]; 
      mrv.push_back(r); 
     } 

     cout << mrv.size() << " records read" << endl; 


     return 0; 
    } 

ビット長すぎるかもしれないが、それはあなたの一日を保存することができます。

4

私はUsing ifstream to read floatsを見て、カンマで解析します。 CSV形式はより複雑ですが、例を開始する必要があります。この例では、テキストの解析と必要な構造要素への変換に非常に優れたString Toolkitを使用しています。

関連する問題