我编写了一个程序用于从控制台读取输入,然后在控制台上再次写入。所以我使用了以下代码。
#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
.