通常,函数std::get()在文件末尾设置eofbit。由于c++ 11 std::unget()首先清除此位,然后继续操作以取消读取最后一个字符。
令我感到困扰的是,到达eof后,unget()似乎对我不起作用,它只能清除一点,但实际上并没有得到任何东西。以后对get()的任何调用甚至都不会再次设置eofbit
这是故意的,我是否错过了文档中的某些内容?

gcc版本6.3.1,-std = c++ 11

#include <iostream>
using namespace std;

int main ()
{
    while ( !cin . eof () )
        cout << " " <<  cin . get () << " ";
    cout << "end" << endl;
    cout << cin . eof () << endl;
    cout << (bool)cin . unget () << endl;
    cout << cin . eof () << endl;
    cout << cin . get () << endl;
    cout << cin . eof () << endl;
    return 0;
}

示例输入foobar
示例输出
 102  111  111  98  97  114  10  -1 end
1
0
0
-1
0

真正困扰我的不是不是将-1放回eof,而是为什么它在最后一个eofbit之后不放回get()呢?

最佳答案

关于eofbitfailbit:



关于get():



Unget清除eofbit,但不能对failbit做任何事情,因此也失败。后续对get的调用失败,因为设置了failbit,并且不检查下一个字符,因此无法设置eofbit

07-25 20:32