将CSV文件读取为双打矢量

时间:2018-11-04 16:18:29

标签: c++ fstream

我正在尝试读取此 csv 文件,我们将其称为“ file.csv”,并且正在尝试将其放入double的向量中。

csv 包含以下数字:

755673.8431514322,
684085.6737614165,
76023.8121728658, 
...

我尝试使用stringstream,它成功将这些数字输入到向量中,但是输入数字与我想要的不一样。而是输入的数字是

7556373, 684085, 76023.8

如何读取整个数字而不丢掉任何数字?

这是我的代码

vector<long double> mainVector;

int main() 
{
    ifstream data;
    data.open("file.csv");
    while (data.good()) 
    {
        string line;
        stringstream s;
        long double db;
        getline(data, line, ',');
        s << line;
        s >> db;
        mainVector.push_back(db);
    }
}

1 个答案:

答案 0 :(得分:2)

  

如何读取整个数字而不丢掉任何数字。

正如@ user4581301在评论中提到的那样,我想您在输出时缺少std::setprecision()

但是,您不需要std::stringstream来完成这项工作。使用 std::stold line(这是一个字符串直接转换为double,然后按如下所示直接放入向量中。

话虽如此,如果从字符串转换为 std::invalid_argument ,则使用std::stold可以确保不会向向量输入错误的符号到 double 失败。 (积分为@ user4581301)

#include <iostream>
#include <fstream>
#include <vector>  // std::vector
#include <string>  // std:: stold
#include <iomanip> // std::setprecision

int main()
{
    std::vector<long double> mainVector;
    std::ifstream  data("file.csv");
    if(data.is_open())
    {
        std::string line;
        while(std::getline(data, line, ','))
            mainVector.emplace_back(std::stold(line));
    }
    for(const auto ele: mainVector)
        std::cout << std::setprecision(16) << ele << std::endl;
                    // ^^^^^^^^^^^^^^^^^^^^ 
    return 0;
}