#include <iostream>
int main( )
{
using namespace std;
cout << cin.rdbuf()->in_avail() << endl;
cin.putback(1);
cin.putback(1);
cout << cin.rdbuf()->in_avail() << endl;
return 0;
} //compile by g++-4.8.1
我认为这将输出0和2
但是当我运行代码时,它输出0和0,为什么?
或者我改变cin.putback(1);到一个; cin&gt;&gt;一个;输入12 12;
它仍然输出0和0
答案 0 :(得分:6)
显然这是某些编译器实现的错误/特性 插入行
cin.sync_with_stdio(false);
在代码开头附近,应该修复它
编辑:还记得in_avail总是会返回1比输入中的字符数多1,因为它会计算输入字符的结尾。
EDIT2:另外,正如我刚刚检查过的那样,除非你先尝试从流中读取内容,否则putback不起作用,因此“回退”中的“后退”。如果你想在cin中插入字符,这个帖子将提供答案: Injecting string to 'cin'
答案 1 :(得分:2)
必须发生的事情是,putback
streambuf
在与std::cin
相关联的egptr() - gptr()
获取区域中找不到任何空间(否则可以获得阅读位置和{{1}由于pbackfail
。
in_avail()
将调用showmanyc()
并且零(这是此虚函数的默认实现)是一个安全的东西,因为它意味着读取可能会阻塞,它可能会失败但不是保证做任何一件事。显然,在这种情况下,实现可以为showmanyc()
提供更有用的实现,但是简单的实现既便宜又符合。