好的,我有一个包含CSV序列的输入文件input.txt
:1,1,1,2,2,3,3,4,4
我试图用逗号分隔它在逗号分隔;不过我在这里遇到一点问题。由于某种原因,序列中的第一个数字甚至没有被流读取。为了说明这一点,我创建了一些调试代码来查看发生了什么,我发现第一个数字存储在csvLine
内,而其他所有数字都被读取和转换。我不明白为什么只省略第一个数字。下面是一个示例图片,显示了我的意思。 num
应具有相同的确切值Line
,但不是。csvLine
。它具有除第一个之外的所有值,它存储在#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
int main(int argc, const char * argv[]) {
ifstream file;
string line;
string csvLine; //comma seperated value line
int num = 0;
file.open(argv[1]);
if(file.is_open()) {
while(getline(file, line)) { //get the whole line and use string stream to break at commas
cout << "\nLine: " << line << endl;
//using stringstream to seperate at commas
stringstream ss(line);
while(getline(ss, csvLine, ',')) {
cout << "csvLine: " << csvLine << " " << endl;
//using stringstream to convert to int
ss >> num;
cout << "num: " << num << " " << endl;
}
}
}
return 0;
}
内。为什么会这样??
{{1}}
答案 0 :(得分:2)
问题出现,因为您正在使用getline
,然后从stringstream
中提取整数
您应该只使用getline
while(getline(ss, csvLine, ','))
{
cout << "csvLine: " << csvLine << " " << endl;
num = std::stoi( csvLine ) ;
}
答案 1 :(得分:1)
当您第一次阅读getline(ss, csvLine, ',')
时,它会读取','
后面的数字。对于下一个数字,它只是读取逗号,因为数字已经使用ss >> num
提取。也就是说,最简单的解决方法是在循环执行后只读取包括逗号在内的所有内容。由于未使用提取逗号的字符串值,因此使用ignore()
代替std::getline()
是有意义的:
for (; ss >> num; ss.ignore(std::numeric_limits<std::streamsize>::max(), ',')) {
// do something with the number
}
以这种方式重构循环具有额外的好处,即检查读取数字是否成功。