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

时间:2013-07-04 15:50:23

标签: 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

我认为这将输出0和2

但是当我运行代码时,它输出0和0,为什么?

或者我改变cin.putback(1);到一个; cin&gt;&gt;一个;输入12 12;

它仍然输出0和0

2 个答案:

答案 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()提供更有用的实现,但是简单的实现既便宜又符合。