我从控制台编写一个读取输入程序,并在控制台上编写agian。所以我使用了以下代码。
#include<iostream>
int main()
{
using namespace std;
cout<<cin.rdbuf();
cin.get();
return 0;
}
但它无限循环。总是得到输入并打印回来。谁能解释一下,这里发生了什么?
它生成以下输出:
(等待输入:输入g)
g
g
(再次等待输入:输入h(任何字符))
h
h
(仍在等待输入:输入h(任何字符))
h
h
等等,当我输入任何字符时,程序总是等待输入它只是打印它。再等一下输入。它不会终止
答案 0 :(得分:1)
有趣的行为。
使用您的热线cout<<cin.rdbuf();
即可致电:ostream& operator<< (streambuf* sb );
来自http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/:
(2)流缓冲区 从由sb指向的流缓冲区对象(如果有)控制的输入序列中检索尽可能多的字符,并将它们插入到流中,直到输入序列用尽或函数无法插入到流中。 在内部,该函数首先构造一个sentry对象来访问输出序列。然后(如果好),它将字符插入到其关联的流缓冲区对象中,就像调用其成员函数sputc一样,最后在返回之前销毁sentry对象。
我假设在内部这个函数在循环中调用streambuffer上的某种getString。这个可能会等待关键输入并将它们转发给ostream。 streambuffer永远不会是空的,但等待一些用户输入。
对于确切答案,&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;应该阅读操作员。
答案 1 :(得分:1)
您确定在标准版上生成了文件结尾
在? <<
上std::streambuf*
的定义是阅读
直到streambuf上的文件结束。基本上,它是一些东西
沿着这条线:
while ( sb->sgetc() != EOF ) {
this->rdbuf()->sputc( sb->sbumpc() );
}
这是简化的;一个实际的实现将不得不做
错误检查sputc
,并设置iostate
位
目的地,根据实际发生的情况。
但这是一个基本的抽象。出于优化原因,
一个真正的实现可能会使用sgetn
而不是sgetc
/ sbumpc
。