Потеря десятичных значений при импорте .txt или .csv в C ++ после копирования из Excel - PullRequest
0 голосов
/ 06 января 2019

У меня есть такой .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

Я хочу данные в первых 3 столбцах

Значения разделяются вкладками после копирования из 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, и ячейки отформатированы как «число» с 4 десятичными знаками. Я попробовал тот же пример с файлом CSV, и то же самое происходит. Если я вручную введу значения в текстовый или CSV-файл, он сохранит десятичное число, но при копировании и вставке десятичные знаки теряются. Тем не менее, мне нужно скопировать и вставить, так как у меня есть в общей сложности тысячи точек данных.

Почему я теряю часть своих данных, когда они импортируются в C ++?

1 Ответ

0 голосов
/ 06 января 2019

Вам необходимо установить точность при распечатке двойных чисел на стандартном выходе. Я также изменяю код, чтобы он был немного более общим.

#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 . . .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...