2013-08-22 33 views
0

讀取文件中的所有字符?我想用C++讀取一個大的CSV文件,但對於我來說,逐行讀取方式對於我來說太慢了(大約5M記錄) 。由於我不確定文件(或空格)中的分隔符,因此我通過char讀取文件char,將其轉換爲字符串,拆分所有值並將轉換後的值填充到數組中以雙打。我的代碼如下所示,但未能讀取'\ n'和''字符?你能幫我解釋一下嗎?如果有更快更可靠的閱讀方式。爲什麼我無法從C++文件中使用std :: vector <char>

bool readPtFast(istream *dataIn, ANNpointArray &p) // read point (false on EOF) 
{ 
    std::istream_iterator<char> begin(*dataIn), end; 
    std::vector<char> in(begin, end); 
    std::string wholeFileString(in.begin(), in.end()); // Not all chars are read!! 


    std::vector<std::string> split_values_string; 
    std::vector<double> split_values_double; 

    boost::split(split_values_string, wholeFileString, boost::is_any_of("\n\r,;\t ")); 
    if (split_values_string.size()!=NRecords*NDims) { 
     cerr << "Error reading file. I expected " << NRecords*NDims << " values, but I found " << split_values_string.size() << "records.\a"; 
     getchar(); 
     return false; 
    } 


    std::transform(split_values_string.begin(), split_values_string.end(), 
     std::back_inserter(split_values_double), 
     boost::lexical_cast<double, std::string>); 

    std::copy(split_values_double.begin(),split_values_double.end(),*p); 

    return true; 
} 
+1

您可以通過使用'istreambuf_iterator的''而不是istream_iterator '扔了很多不必要的(由它的外觀)處理。前者只是拋出檢查和流式字符。我們在這裏談論的文件有多大?我看到5M記錄;這是否意味着5M *雙*或5M *行*? – WhozCraig

+0

我想要一個'istream&',而不是一個指針。它更容易使用。 – chris

回答

相關問題