我有一个这样的.txt文件,其中包含数百行:
109787.3634 108234.1301 106952.8345 1.0000
110010.6294 108250.4733 106975.6766 1.0000
110243.5609 108312.5631 106999.9469 1.0000
110482.4885 108382.7281 107025.0583 1.0000
110724.3577 108461.8582 107051.2432 1.0000
我想要前三列中的数据
从excel复制后,值用制表符分隔(我也尝试将excel数据另存为CSV,但存在如下所述的相同问题)。
这是我的代码,用于导入数据,这些数据是从各种来源借来的:
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std;
int main()
{
double data[360][3];
ifstream file("tsv.txt");
for(int row = 0; row < 360; ++row)
{
string line;
getline(file, line);
if ( !file.good() )
break;
stringstream iss(line);
for (int col = 0; col < 3; ++col)
{
string val;
getline(iss, val, '\t');
if ( !iss.good() )
break;
stringstream convertor(val);
convertor >> data[row][col];
}
}
for (int i = 0; i<360 ; ++i)
{
for (int j = 0; j<3 ; ++j)
{
cout << data[i][j] << " ";
}
cout << endl;
}
system("PAUSE");
return 0;
}
代码提取数据并将其存储在数组中。但是,所有小数位都丢失了,cout返回此值(注意没有舍入):
109787 108234 106952
110010 108250 106975
110243 108312 106999
110482 108382 107025
110724 108461 107051
所有这些数据都直接从excel复制到文本文件中,并且单元格的格式设置为“数字”,小数点后四位。我用CSV文件尝试了相同的示例,并且发生了相同的情况。如果我手动将值键入到文本或CSV文件中,它将保留小数点,但是当我复制并粘贴小数点时会丢失。但是,由于我总共有数千个数据点,因此需要复制和粘贴。
为什么将导入到C ++的数据丢失一部分?
答案 0 :(得分:2)
在标准输出上打印双精度数字时,需要设置精度。 我还更改了代码,使它更加通用。
#include <fstream>
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
struct numbers
{
double a, b, c;
};
int main()
{
vector<numbers> data;
ifstream file("tsv.txt");
if (!file.good())
return -1;
double a, b, c, d;
while (file >> a >> b >> c >> d) {
data.push_back(numbers{ a,b,c });
}
for (auto num : data)
{
cout << setprecision(16) << num.a << " " << num.b << " " << num.c << "\n";
}
system("PAUSE");
return 0;
}
输出为:
109787.3634 108234.1301 106952.8345
110010.6294 108250.4733 106975.6766
110243.5609 108312.5631 106999.9469
110482.4885 108382.7281 107025.0583
110724.3577 108461.8582 107051.2432
Press any key to continue . . .