2012-09-02 254 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循環和向量來迭代?即 對(INT I = 0;我< 5;我++){// 在數據讀出在矢量 //商店 }

任何提示都十分讚賞

+0

[如何使用逗號分隔值讀入/從文本文件中讀取/寫入](http://stackoverflow.com/questions/1474790/how-to-read-write-into-from-text-file -with-逗號分隔值) –

回答

8

CSV格式是更復雜而不僅僅是一個逗號分隔符。它可以包含你應該逃避和解釋的引號,並且可以允許不同的分隔符。如果您的輸入文件沒有嚴格格式化,您確實應該使用專用的CSV導入/導出庫。

標記器類可能會回答您的問題(例如boostsimpler ones可用)。

您應該檢查關於此主題的otherquestions

6

Heed @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; 
    } 

太長了一點,也許,但它可以節約你的時間。