2017-03-20 42 views
0

我有一個csv文件,5列和100行。 我的目標是將文件加載到一個vectorData如何將csv文件中的值加載到2d矢量<double>?

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

using namespace std; 

int main() 
{ 

int count = 0; 
vector<double> data; 
string line; 

cout << "Testing loading of file." << endl; 
ifstream myfile ("iris.csv"); 
if (myfile.is_open()) 
{ 
    while (! myfile.eof()) 
    { 
      getline (myfile, line); 
      data.push_back(line); 
     // logs.at(count) = line; 
      count++; 
    } 
    myfile.close(); 
}else{ 
     cout << "Unable to open file." << endl; 
} 
cout << "the log count is: " << count << endl; 

return 0; 
} 

我試着寫上面的代碼只需輸入值1到載體中,但是當我嘗試編譯我得到的錯誤

lab6.cpp: In function ‘int main()’: 
lab6.cpp:22:35: error: no matching function for call to      ‘std::vector<double>::push_back(std::__cxx11::string&)’ 
      data.push_back(line); 
          ^
In file included from /usr/include/c++/6.3.1/vector:64:0, 
       from lab6.cpp:4: 
/usr/include/c++/6.3.1/bits/stl_vector.h:914:7: note: candidate: void    std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = double; _Alloc = std::allocator<double>; std::vector<_Tp, _Alloc>::value_type = double] 
    push_back(const value_type& __x) 
    ^~~~~~~~~ 
/usr/include/c++/6.3.1/bits/stl_vector.h:914:7: note: no known  conversion for argument 1 from ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘const value_type& {aka const double&}’ 
/usr/include/c++/6.3.1/bits/stl_vector.h:932:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = double; _Alloc = std::allocator<double>; std::vector<_Tp, _Alloc>::value_type = double] 
    push_back(value_type&& __x) 
    ^~~~~~~~~ 
/usr/include/c++/6.3.1/bits/stl_vector.h:932:7: note: no known conversion for argument 1 from ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘std::vector<double>::value_type&& {aka double&&}’ 

人指向我正確的方向我如何修改代碼或從頭開始爲了加載到2D矢量的值?

來自csv文件的示例數據。

-0.57815,0.83762,-1.0079,-1.0369,-1 
-0.88983,-0.20679,-1.0079,-1.0369,-1 
-1.2015,0.21097,-1.0769,-1.0369,-1 
-1.3573,0.0020888,-0.93891,-1.0369,-1 
-0.73399,1.0465,-1.0079,-1.0369,-1 
-0.11064,1.6731,-0.80094,-0.683,-1 
-1.3573,0.62874,-1.0079,-0.85994,-1 
+0

另外,'vector data;'不是一個2D矢量。 'vector > data;'可能儘可能接近您的需要,但由於空間局部性較差可能會變慢。如果你總是有5列'vector '應該會更快。 – user4581301

+0

'while(!myfile.eof())'是一個常見的錯誤。更多關於這裏:http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – user4581301

+0

,並沒有指向'計數++;'。 'vector'知道它有多大。 'cout <<「的日誌計數是:」<< data.size()<< endl;'會做你所需要的。 – user4581301

回答

-1

至少有2個問題在這裏:

  1. 您正在試圖推動整個行(在你的文件的情況下,由多個號碼)到載體。所以你也需要用逗號分隔這一行。我想用strtok分割字符串。

  2. vector.push_back()需要一個類型爲double的參數,但是您要傳遞一個字符串。您必須先將您的字符串轉換爲雙精度型。

    是在我腦海中的字符串轉換爲雙打第一種方法是atof(實際上轉換一個C_STRING爲float,但希望你能處理字符串到C_STRING和浮到雙的轉換。

    有些人真的很討厭ATOF由於一些安全問題,但他們並非全錯,但它很可能你需要爲你的程序。

對於這兩個問題,你不應該有任何查找堆棧溢出時遇到的問題以找到如何執行它們的示例。

此外,我注意到您的示例文件看起來像每列指示不同類型的數據。最有可能的是,你實際上並不想將它們存儲在一個向量中,而只是一些二維對象(如vector>)。