为什么C ++ StringStream跳过输入文件中的第一个数字,但显示其余的?

时间:2014-10-26 19:59:09

标签: c++ csv getline stringstream argv

好的,我有一个包含CSV序列的输入文件input.txt1,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; } 内。为什么会这样??

program output showing how it skips the first number

{{1}}

2 个答案:

答案 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
}

以这种方式重构循环具有额外的好处,即检查读取数字是否成功。