C ++ stringstream和fail vs eof

时间:2015-11-11 02:31:36

标签: c++ stl stringstream

想知道这里发生了什么。我试图通过gdb推送这个,但似乎无法获得libstdc ++的调试版本/代码,所以希望有人知道他们的流可以提供帮助吗?在下面的代码中,关键位是while循环:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <sstream>
using namespace std;
void printer(int i) {
        cout << i << ", ";
}
int main ()
{
        string s;
        getline(cin, s);
        stringstream input(s);
        vector<int> v1;
        int i;
        while (!input.fail())
        {
                input >> i;
                v1.push_back(i);
        } 
        for_each(v1.begin(), v1.end(), printer);
        return 0;
}

当我运行它并提供一个数字时,这似乎将该数字两次添加到矢量。如果我将while循环的条件更改为eof()(而不是fail()),则所有操作都符合我的预期。

因此,如果提取operator>>应该从流中提取值,那么连续调用如何继续生成结果?

我猜我没有考虑到这一点(当地时间凌晨2:30,所以可能与它有关!)

使用gcc版本4.9.2(Ubuntu 4.9.2-0ubuntu1~12.04)

1 个答案:

答案 0 :(得分:4)

这是通常的incorrect use of eof()错误的伪装版本。

循环应该是:

while ( input >> i )
    v1.push_back(i);

在您的实际代码中,即使读取失败,您仍然push_back(i)

eof()的版本中,在读取前一个值时,它可能会或可能不会实际设置eof标志;你不能依赖你所观察的东西。