我有一个代码,它获取一个.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
.这将被打印出来,循环退出。
您似乎想逐行阅读。这是通过没有第三个参数(或第三个参数等于'n'
(的getline
来完成的。此外,还有一个杂散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>
它读取空格分隔的数字,直到文件末尾。