我知道像“
因此,我理解的缓冲区被刷新是指输入被存储在一个缓冲区中,并且只有当它遇到
endl
和\n
的区别”这样的问题在SO上已经有很多答案了。但是它们只提到了endl
能够将缓冲区刷新到stdout
,而\n
则不能。因此,我理解的缓冲区被刷新是指输入被存储在一个缓冲区中,并且只有当它遇到
endl
或某些显式的flush
函数时才传递到stdout
。如果是这样,我预期以下代码:#include <iostream>
#include <unistd.h>
int main(void)
{
std::cout << "Hello\nworld";
sleep(2);
std::cout << std::endl;
return 0;
}
展示:
2秒后
Hello
World
但实际输出为:
Hello
2秒后
World
为什么会这样呢?
不应该将\n
也存储在缓冲区中,直到遇到endl
时才将缓冲区刷新/显示到stdout
吗?但是从我观察到的情况来看,\n
的行为与endl
相同。
cout
的输出目标。如果输出到终端(即“交互设备”),那么它不能完全缓冲 - 通常是按行缓冲,这意味着在打印换行符后字符就会出现,或者在理论上可以是不带缓冲的。如果输出到管道、文件或其他非交互式目标,则endl
强制将数据输出,即使流通常是完全缓冲的。 - Jonathan Lefflerendl
,当程序执行到结尾时,输出是否会显示在stdout
上?我知道在终端上是这样的,但对于所有类型的stdout
都适用吗? - CaptainDaVincistd::cin
绑定到std::cout
:每当访问std::cin
时,std::cout
就会被刷新。对于写入stdout
的C++程序观察到行缓冲行为的实际原因是与stdio同步,显然,对于使用标准流的任何理智的C++程序,该同步已禁用,否则程序会变得不合理地减慢。 - Dietmar Kühl