C++字符串流和失败与eof

C++ stringstream and fail vs eof

本文关键字:eof 失败 字符串 C++      更新时间:2023-10-16

想知道这里发生了什么。我试图通过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)

这是eof()错误的常见错误使用的一个薄薄的伪装版本。

循环应为:

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

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

在具有eof()的版本中,它在读取先前值时可能实际设置eof标志,也可能不实际设置;你不能依赖你所观察到的。