C++ 为什么in_avail()即使流有一些字符也输出零? #包括 int main() { 使用名称空间std; 输入12时输入的cout

C++ 为什么in_avail()即使流有一些字符也输出零? #包括 int main() { 使用名称空间std; 输入12时输入的cout,c++,C++,它仍然输出0和0必须发生的是,您的回拨在streambuf获取区域中找不到与std::cin相关的任何空间(否则读取位置将可用,egptr()-gptr()将为非零)由于pbackfail,它必须已转到底层 in\u avail()将调用showmanyc()和zero(这是此虚拟函数的默认实现)返回是安全的,因为这意味着读取可能会阻塞,也可能会失败,但这两种情况都不能保证。显然,实现可以为showmanyc()提供更有用的实现在这种情况下,但是简单的实现既便宜又一致。显然,这是某些编译器实现的

它仍然输出0和0

必须发生的是,您的
回拨
streambuf
获取区域中找不到与
std::cin
相关的任何空间(否则读取位置将可用,
egptr()-gptr()
将为非零)由于
pbackfail
,它必须已转到底层


in\u avail()
将调用
showmanyc()
和zero(这是此虚拟函数的默认实现)返回是安全的,因为这意味着读取可能会阻塞,也可能会失败,但这两种情况都不能保证。显然,实现可以为
showmanyc()提供更有用的实现
在这种情况下,但是简单的实现既便宜又一致。

显然,这是某些编译器实现的一个bug/功能 插入行

#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
在代码开头附近的某个地方,这应该可以修复它

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

EDIT2:正如我刚才所检查的,除非您尝试先从流中读取某些内容,否则putback不起作用,因此“putback”中的“back”会出现。如果您想在cin中插入字符,此线程将提供答案:

我的猜测是,这是因为流中根本没有任何内容,因此它无法“放回”任何内容。此外,您可能需要检查putback()的返回值看看它是否成功。@PeterK但是如果我这样做-->int a;cin>>a;输入:12 1222;我仍然得到输出0和0查看libstdc++实现,
putback
的实现方式是这样的,在这里,它解析为C库函数
ungetc
,与
cin
相关联的缓冲区不知道任何信息挂起的字符。查看标准,我看不出这一点的理由。@hvd:它可能与27.5.3.4p3有关,其中指出当
sync_with_stdio(true)
生效时,
ungetc
具有与
rdbuf()相同的效果->sputbackc
@interjay我认为你是对的,这是相关的,在
cin.sync_与_stdio(false);
之后,行为发生了变化。但它似乎(注意:外观可能是欺骗)只是被错误地实现了,然后…太棒了!为我工作,我正在使用g++7.3.0。
cin.sync_with_stdio(false);