由于cout<<cin.rdbuf()导致的无限循环,为什么?

Infinite Loop due to cout<<cin.rdbuf(), why?

本文关键字:lt 无限循环 为什么 cin cout rdbuf 由于      更新时间:2023-10-16

我编写了一个程序用于从控制台读取输入,然后在控制台上再次写入。所以我使用了以下代码。

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

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

它生成以下输出:

(等待输入:输入g(

g
g
(

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

h
h
(

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

h
h

依此类推,当我输入任何字符时,程序总是等待输入,它只是打印它。 再次等待输入。 它不会终止

有趣的行为。用您的线路cout<<cin.rdbuf();您正在呼叫:ostream& operator<< (streambuf* sb );

从 http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/:

(2( 流缓冲区 从由 sb 指向的流缓冲区对象控制的输入序列中检索尽可能多的字符(如果有(,并将它们插入到流中,直到输入序列用尽或函数无法插入到流中。 在内部,该函数通过首先构造哨兵对象来访问输出序列。然后(如果很好(,它将字符插入到其关联的流缓冲区对象中,就像调用其成员函数 sputc 一样,最后在返回之前销毁哨兵对象。

我假设在内部,这个函数在循环中调用流缓冲区上的某种 getString。这个可能会等待关键输入并将它们转发到 ostream。流缓冲区永远不会为空,而是等待一些用户输入。

对于确切的答案,应阅读<<运算符的实现。

您确定要在标准上生成文件结尾吗在? std::streambuf*<<的定义是阅读直到流上的文件结束。 基本上,它是一些东西大致如下:

while ( sb->sgetc() != EOF ) {
    this->rdbuf()->sputc( sb->sbumpc() );
}

这是简化的;实际的实现必须做对sputc进行错误检查,iostate并在目的地也是如此,根据实际发生的事情。但这是一个基本的抽象。 出于优化原因,真正的实现可能会使用 sgetn 而不是 sgetc/sbumpc .