0

この .csv ファイルを読み込もうとしています。データの例を次に示します。

1.33286E+12 0   -20.790001  -4.49   -0.762739   -3.364226   -8.962189

1.33286E+12 0   -21.059999  -4.46   -0.721878   -3.255263   -8.989429

問題は最初の列の行 1 と 2 にあります。Excel ファイルでは、セル内の数値が 1.33286E+12 として表示され、セルをクリックすると 1332856031313 と 1332856031328 と表示されますが、プログラムはそれらを読み取っています。 1.33286E+12 ですが、整数 1332856031313 と 1332856031328 が必要です。

コード:

inputfile.open(word1.c_str());
while (getline (inputfile, line)) //while line reads good
{
  istringstream linestream(line); //allows manipulation of string
  string str;

while (getline (linestream, item, ',')) //extract character and store in item until ','
    {

  char * cstr, *p; 
  cstr = new char [item.size()+1]; 
  strcpy(cstr, item.c_str()); 
  p = strtok(cstr, " "); 

  while (p!=NULL) //while not at the end loop
    {      // double e = atof(p); // coverts p to double
        value++;
        if( value == 1)
                {     double e = atof(p); // coverts p to double
          if(m ==1)
          cout << time[0]<<"\n";

          ostringstream str1;
           str1 << e;
          str = str1.str();
          string str2;
          str2.append(str.begin(), str.end());
          const char * convert = str2.c_str();
          e = atof(convert);
         time[m] = e*0.001;
          m++;
          //if(m >=192542)
          //cout << time[m-1]<<"\n";

        }

               p = strtok(NULL, " ");
    }
  delete[] cstr; //delete cstr to free up space.
}
count ++;
value = 0;
}
inputfile.close();
4

2 に答える 2

2

番号 1332856031313 が 1.33286E+12 としてシリアル化されている場合、逆シリアル化プロセスでそれを取り戻す方法はありません。これらの 6 桁の余分な有効数字の形式の情報は永久に失われます。CSV ファイルが生成されるときに、それが完全な精度で保存されることを確認する必要があります。Excelでこれを行う方法がわかりません。

また、atofandの使用はconst char*C++ 風ではありません。次のようなコードの使用を検討してください

double a, b, c, d;
linestream >> a >> b >> c >> d;

代わりは。

于 2012-06-15T14:43:31.797 に答える
0

ルークは私を打ち負かしましたが、私は 1 つの提案をします。デコードにループを使用し、文字列ストリームのステータスをテストします。OK、2 つの提案: コードを関数に分割します。ひとくくりにすると分かりにくくなります。

    void DecodeLine(const std::string &sLine, 
                    std::vector<double> &vResults)
    {
        std::istringstream istr(sLine);
        double d = 0;
        istr >> d;
        while (!istr.fail())
        {
            vResults.push_back(d);
            istr >> d;
        }
    }
于 2012-06-15T15:43:20.007 に答える