C ++ чтение CSV в вектор, проблема getline () - PullRequest
0 голосов
/ 11 февраля 2019

Данные моего csv-файла выглядят так:

Palmer Shannon,1.66805E+12,7500,3020
Jonas Kelley,1.62912E+12,9068,1496
Jacob Doyle,1.61608E+12,1112,3502
Iola Hayden,1.60603E+12,6826,4194

Это мой заголовочный файл:

#ifndef client_h
#define client_h
#include <string>

const int MAX_CLIENT = 20;

struct client {
    std::string name;
    long long  accountNum;
    int pwd;
    double balance;
};

Для первых данных имя строки относится к Palmer Shannon , long long относится к 1.66805E + 12 , int pwd относится к 7500 , а двойной баланс относится к 3020 .

Это мой файл main.cpp, и я пытаюсь создать вектор для хранения данных файла csv.

string str;
    std::vector<client> readClientProfile;
    while (getline(data, str))
        {

        client Client;
        istringstream iss(str);
        string token;
        getline(iss, Client.name, ',');

        getline(iss, token, ',');
        Client.accountNum = std::stoi(token);


        getline(iss, token, ',');
        Client.pwd = std::stoi(token);

        getline(iss, token, ',');
        Client.balance = std::stoi(token);


        readClientProfile.push_back(Client);
    }
    for (size_t i = 0; i < readClientProfile.size() - 1; i++)
    {

            std::cout << readClientProfile[i].name << "  "<<endl;
            std::cout << readClientProfile[i].accountNum << "  "<<endl;
            std::cout << readClientProfile[i].pwd << "  "<<endl;
            std::cout << readClientProfile[i].balance << "  "<<endl;

        }

Вопрос в том, когда я запускаю программу, accountNum просто показывает первыймир 1 .Я не могу изменить тип accountNum, потому что это запрос присваивания. Как читать длинный длинный тип с переменной, символом и символом?

1 Ответ

0 голосов
/ 11 февраля 2019

Номер учетной записи в вашем файле хранится как 1.66805E+12.Это число с плавающей запятой, а не целое число.Когда вы используете stoi для преобразования его в, он анализирует строку и останавливается на ., поскольку это не является допустимым символом в целом числе.Это означает, что stoi вернет 1 для всех номеров счетов.Вы можете исправить это, сначала преобразовав 1.66805E+12 в double, используя stod, а затем вы можете сохранить double как целое число, например

getline(iss, token, ',');
Client.accountNum = std::stod(token);
...