我正在尝试阅读此.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();
答案 0 :(得分:2)
如果数字1332856031313被序列化为1.33286E + 12,则无法在反序列化过程中将其恢复。这6个额外有效数字形式的信息将永远消失。您需要确保在生成CSV文件时,它以完全精确的方式保存。我不知道你怎么用Excel做这件事。
此外,您对atof
和const char*
的使用并不是非常C ++。考虑使用像
double a, b, c, d;
linestream >> a >> b >> c >> d;
代替。
答案 1 :(得分:0)
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;
}
}