【问题标题】:c++ get() doesn't set eofc++ get() 没有设置 eof
【发布时间】:2017-05-01 14:11:02
【问题描述】:

函数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,而是为什么在最后一个get() 之后不放回eofbit

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    关于eofbitfailbit

    到达文件结尾设置 eofbit。但请注意,操作 到达文件结尾的也可能设置故障位,如果这使它们 失败(因此设置了 eofbit 和 failbit)。

    关于get()

    读取一个字符并在可用时返回它。否则,返回 Traits::eof() 并设置 failbit 和 eofbit。

    Unget 清除了eofbit,但无法对failbit 执行任何操作,因此也失败了。对get 的后续调用由于设置了failbit 而失败,并且不检查下一个字符,因此它们无法设置eofbit

    【讨论】:

      猜你喜欢
      • 2012-12-18
      • 2019-09-09
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      相关资源
      最近更新 更多