将异常字符串解析为向量上的浮点运算?

Resolving anomalous string to float operation on a vector?

我有一个代码可以获取 .csv 文件并读取值并将其打印出来。 .csv 文件的内容是 -

55
100
200
500
500
150 

我正在使用 stof 方法将字符串转换为这样的浮点数 -

    for (unsigned int i = 0; i < DataStore.size(); i++)
        cout << stof(DataStore[i]) << endl;

但在这种情况下我只得到输出

55

而不是 -

55
100
200
500
500
150 

我是 C++ 的新手,所以我很确定我遗漏了一些微不足道的东西 - 但无法弄清楚。

最小可重现代码 -

    string line;
    vector<string> DataStore;
    {

        ifstream file("test.csv");
        while (getline(file, line, ','))
        {
            DataStore.push_back(line);
            getline(file, line);
        }

    }

    for (unsigned int i = 0; i < DataStore.size(); i++)
        cout << stof(DataStore[i]) << endl;

test.csv内容如下-

55
100
200
500
500
150 
while (getline(file, line, ','))

这从文件中读取直到遇到逗号。你的文件中没有逗号,所以整个文件将被读入 line,这个 line 被插入到 DataStore 并且循环不会进一步迭代,因为什么都没有了待下次 getline.

阅读

因此 DataStore.size() 将是一个并且在单次迭代中整个文件的内容被传递给 stof,它将从头开始形成解析的数字,直到它遇到不是有效的一部分的东西号码,这里是换行符。结果将是 55。这被打印出来,循环退出。

您似乎想逐行阅读。这是由 getline 完成的,没有第三个参数(或第三个参数等于 '\n')。此外还有一个流浪者getline,我不知道它的目的。

string line;
vector<string> DataStore;
{

    ifstream file("test.csv");
    while (getline(file, line))
    {
        DataStore.push_back(line);
    }

}

for (unsigned int i = 0; i < DataStore.size(); i++)
    cout << stof(DataStore[i]) << endl;

请注意,您可以直接将文件中的数字读入 std::vector:

ifstream file("test.csv");
vector DataStore(istream_iterator<double>(file), {});

这需要 #include<iterator> 并且在 C++17 之前需要指定 vector 类型:vector<double>

它读取白色-space 分隔的数字,直到文件结束。