#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
Run Code Online (Sandbox Code Playgroud)
我想这会输出0和2
但是当我运行代码时,它输出0和0,为什么?
或者如果我改变cin.putback(1); 到一个; cin >> a; 输入12 12;
它仍然输出0和0
显然,它是某些编译器实现的错误/特性插入行
cin.sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)
在代码开头附近的某个地方,应该修复它
编辑:还记得in_avail总是会返回1比输入中的字符数多1,因为它计算输入字符的结尾.
EDIT2:另外,正如我刚刚检查过的那样,除非你先尝试从流中读取内容,否则putback不起作用,因此"回退"中的"后退".如果你想在cin中插入字符,这个线程将提供答案: 将字符串注入'cin'
一定发生的事情是,您在与相关的获取区域putback中没有找到任何空间(否则读取位置将可用并且将是非零)并且由于 . 必须已经进入底层。streambufstd::cinegptr() - gptr()pbackfail
in_avail()将调用showmanyc()并且零(这是此虚拟函数的默认实现)是返回的安全事物,因为这意味着读取可能会阻塞并且可能会失败,但不保证会执行任何操作。显然,在这种情况下,实现可以提供更有用的实现showmanyc(),但简单的实现既便宜又一致。