函数List<List<DataType>>
通常在文件末尾设置std::get()
。由于c ++ 11 eofbit
首先清除此位然后执行以取消最后一个字符读取。
令我感到困扰的是,在我到达eof后,std::unget()
似乎对我不起作用,它只是清除了一点但实际上并没有取消任何东西。对unget()
的任何后续调用甚至都不会再次设置get()
。
这是故意的,我是否遗漏了文档中的内容?
gcc版本6.3.1,-std = c ++ 11
eofbit
示例输入#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
真正困扰我的不是它为eof取消 102 111 111 98 97 114 10 -1 end
1
0
0
-1
0
,而是为什么它不会在最后-1
之后退回eofbit
?
答案 0 :(得分:3)
关于eofbit
和failbit
:
到达文件结尾设置eofbit。但请注意操作 到达文件结束时,如果这样做,也可以设置failbit 失败(因此设置了eofbit和failbit)。
关于get()
:
读取一个字符并返回(如果可用)。否则,返回 Traits :: eof()并设置failbit和eofbit。
Unget会清除eofbit
,但无法对failbit
执行任何操作,因此也会失败。由于设置了get
而导致failbit
的后续调用失败,因此无法检查下一个字符,因此他们无法设置eofbit
。