2017-03-20 10 views
0

私は5列と100行のcsvファイルを持っています。 私の目的は、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

さらに、「ベクトルデータ;」は2Dベクトルではありません。 'vector > data;'はおそらくあなたの必要に近いものですが、空間的な場所が悪いために遅くなる可能性があります。あなたが常に5列を持っているなら 'ベクトル<配列'はより速くなければなりません。 – user4581301

+0

while(!myfile.eof()) 'は一般的なエラーです。それに関する詳細はこちら:http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – user4581301

+0

そして 'count ++;'には何の指摘もありません。 'ベクトル'はそれがどれだけ大きいかを知っています。 'cout <<"ログの数は次のようになります。 "<< data.size()<< endl;は必要な処理を行います。 – user4581301

答えて

-1

少なくとも2つの問題がここにあります

  1. あなたはベクター(ファイルの場合には、複数の数字からなる)行全体をプッシュしようとしています。したがって、コンマで区切る必要もあります。

    strtokを使用して文字列を分割します。

  2. vector.push_back()は、double型の引数を必要としますが、文字列を渡しています。最初に文字列をダブルに変換する必要があります。

    ダブルスに文字列を変換するための私の心に来る最初の方法は、実際にフロートにC_STRINGに変換atof(ですが、うまくいけば、あなたはC_STRINGと、二重にフロートに文字列の変換を処理することができます。

    一部の人々は、実際にいくつかの安全性の問題に起因するatof嫌い、彼らは完全に間違っていないですが、その可能性が、あなたのプログラムのために必要なすべての。

    これらの問題の両方のために

、あなたがいずれかを持っているべきではありませんスタックのオーバーフローを検索する際のトラブルシューティングの例を参照してください。

また、私はあなたのサンプルファイルが各列が異なるタイプのデータを示しているように見えることに気付きました。おそらく、実際にはベクトルに格納するのではなく、2次元オブジェクト(vector>など)を格納する必要があります。

関連する問題