为什么即使流有一些char,in_avail()输出为零?

mis*_*coo 8 c++

#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

Mad*_*gre 7

显然,它是某些编译器实现的错误/特性插入行

cin.sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)

在代码开头附近的某个地方,应该修复它

编辑:还记得in_avail总是会返回1比输入中的字符数多1,因为它计算输入字符的结尾.

EDIT2:另外,正如我刚刚检查过的那样,除非你先尝试从流中读取内容,否则putback不起作用,因此"回退"中的"后退".如果你想在cin中插入字符,这个线程将提供答案: 将字符串注入'cin'


CB *_*ley 2

一定发生的事情是,您在与相关的获取区域putback中没有找到任何空间(否则读取位置将可用并且将是非零)并且由于 . 必须已经进入底层。streambufstd::cinegptr() - gptr()pbackfail

in_avail()将调用showmanyc()并且零(这是此虚拟函数的默认实现)是返回的安全事物,因为这意味着读取可能会阻塞并且可能会失败,但不保证会执行任何操作。显然,在这种情况下,实现可以提供更有用的实现showmanyc(),但简单的实现既便宜又一致。