从Excel复制后将.txt或.csv导入C ++时,十进制值丢失

时间:2019-01-06 12:17:08

标签: c++ excel csv import

我有一个这样的.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 ++的数据丢失一部分?

1 个答案:

答案 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 . . .