由于cout<无限循环

时间:2014-10-29 13:43:07

标签: c++ io stream console

我从控制台编写一个读取输入程序,并在控制台上编写agian。所以我使用了以下代码。

#include<iostream>
int main()
{
    using namespace std;
    cout<<cin.rdbuf();
    cin.get();
    return 0;
}

但它无限循环。总是得到输入并打印回来。谁能解释一下,这里发生了什么?

它生成以下输出:

(等待输入:输入g)

g
g

(再次等待输入:输入h(任何字符))

h
h

(仍在等待输入:输入h(任何字符))

h
h

等等,当我输入任何字符时,程序总是等待输入它只是打印它。再等一下输入。它不会终止

2 个答案:

答案 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