c++ - 换行符是否也刷新缓冲区?

标签 c++ flush endl

我知道像 endl\n 之类的问题已经在 SO 上得到了多次回答。但他们只提到 endl 能够将缓冲区刷新到 stdout 上,而 \n 则不能。

因此,我对刷新缓冲区的理解是,给定的输入存储在缓冲区中,并且仅在遇到 endl 时才传递到 stdout ,或一些明确的 flush 函数。如果是这样,我希望以下代码:

#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 也会强制输出数据,这通常是这样。

I also wanted to know if I provided neither new line character nor endl, will the output be displayed on the stdout once it reaches the end of the program, I know it does for terminal, but is it applicable to all types of stdout?

是的,当文件流在程序的(正常)结束时关闭时,挂起的输出将被刷新。当缓冲区已满时,它也会被刷新。如果程序中止,挂起的输出通常不会被刷新。

关于c++ - 换行符是否也刷新缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42430701/

相关文章:

c++ - std::endl 在字符串变量中?

c++ - 配对可变参数模板(命名元组)

c++ - 原生 C++ 中的数据驱动设计

c++ - 将 C 格式字符串转换为 C++ io 操纵器

c - 从 C 中的 stdin 读取数字

c++ - 发送 std::endl 到流给出内存地址

c++ - 当我添加语句时,C++ 中的结果输出错误

c++ - 最小的 Qt 可执行文件大小

java - 保持输出流打开

hibernate - hibernateTemplate Flush() 和 clear() 方法有什么区别?