0

data.csvファイルから 24 個の変数にデータをインポートするために使用するコードを次に示します。

#include <iostream>
#include <fstream>
using namespace std;

double xa = 0;
double ya = 0;
double Ta = 0;
double Ca = 0;
double Ma = 0;
double Da = 0;

double xb = 0;
double yb = 0;
double Tb = 0;
double Cb = 0;
double Mb = 0;
double Db = 0;

double xc = 0;
double yc = 0;
double Tc = 0;
double Cc = 0;
double Mc = 0;
double Dc = 0;

double xd = 0;
double yd = 0;
double Td = 0;
double Cd = 0;
double Md = 0;
double Dd = 0;


//__________________________________________________

int trash    = 0;   // ifstream bug (?) stuff

//___________________________________

int main() {


    ifstream ifs ("data.csv"); ///LOADING
if (!ifs)
    // process error
ifs >>  trash;
ifs >>  xa ;
ifs >>  ya ;
ifs >>  Da ;
ifs >>  Ma ;
ifs >>  Ca ;
ifs >>  Ta ;
ifs >>  xb ;
ifs >>  yb ;
ifs >>  Db ;
ifs >>  Mb ;
ifs >>  Cb ;
ifs >>  Tb ;
ifs >>  xc ;
ifs >>  yc ;
ifs >>  Dc ;
ifs >>  Mc ;
ifs >>  Cc ;
ifs >>  Tc ;
ifs >>  xd ;
ifs >>  yd ;
ifs >>  Dd ;
ifs >>  Md ;
ifs >>  Cd ;
ifs >>  Td ;

もちろん(私は推測します...)、このCSV構造でのみ機能します(各行には新しい単一のデータが含まれています:)

63.64474122 
5.21472834  
0.40511019  
0.26155648  
0.00000000  
0.00000000
34.45902482 
15.62249852 
0.22086168  
0.00000000  
0.44580498  
0.00000000
82.11020306 
14.02709406 
0.50748794  
0.00000000  
0.00000000  
0.15917872
0.00000000  
0.00000000  
0.00000000  
0.00000000  
0.00000000  
0.00000000

明らかな実用的な理由から、CSV (タブと改行で区切られた) にこのファイル構造を使用したいと思います。

63,64474122 5,21472834  0,40511019  0,26155648  0,00000000  0,00000000
34,45902482 15,62249852 0,22086168  0,00000000  0,44580498  0,00000000
82,11020306 14,02709406 0,50748794  0,00000000  0,00000000  0,15917872
0,00000000  0,00000000  0,00000000  0,00000000  0,00000000  0,00000000

誰かが私を助けてくれますか?

4

1 に答える 1

1

あなたのコードは(ひどいものですが)両方のファイルでうまく動作するはずです。iostream入力演算子は input をstreamとして扱います。つまり、 or のような型intの場合double、値がどのように (改行または空白で) 区切られているかは気にしません。

よく見ると、2 番目のファイルでは小数点の代わりにコンマが使用されていることがわかります。これを処理するには、次の 3 つの方法があります。

  • コンマを小数点として扱うロケールにすることができます (この質問を参照してください) 。
  • プログラムでファイルを読み取る前に、スクリプトを使用してファイルを前処理できます。
  • 最後に、std::string最初に各数値を変数 に読み取っstd::istringstreamてから、 convert toを使用できdoubleます。

いずれにせよ、iostream使用法を熟読することを真剣に検討する必要があります。少なくとも、入力エラーをチェックする必要があります。いいえ、 「ifstream バグ」などはありません。

于 2013-11-05T03:55:18.233 に答える