【问题标题】:Why does `\n` flush std::cout? [duplicate]为什么 `\n` 刷新 std::cout? [复制]
【发布时间】:2015-10-02 18:22:18
【问题描述】:

我是 C++ 的新手,据我所知,使用转义序列 '\n' 不会刷新输出缓冲区(使用 endl 时会发生这种情况),但在我的情况下在 Ubuntu 14.04 的 qt-creator 下使用 F11 (step into) 调试以下程序时,函数的输出 (5) 直接打印到控制台。

#include <iostream>

void printValue(int nValue)
{
    std::cout << nValue << '\n';
}

int main()
{
    using namespace std;
    printValue(5);
    return 0;
}

当我从第 1 行的输出中删除 '\n' 时。 5、输出推迟到执行结束。

  • 这是为什么呢?

【问题讨论】:

  • 查看 libc 函数:setbuf 和 setlinebuf。 setlinebuf 是程序启动时 stdout/stderr [aka std::cout/std::cerr] 的隐式默认值。对于您自己打开的流,它们被赋予默认缓冲区大小,并且缓冲区必须在刷新之前填充。

标签: c++


【解决方案1】:

标准没有定义flush的时间,所以stream可以随时flush。

【讨论】:

    【解决方案2】:

    是的,endl 会导致刷新,但这并不意味着缓冲区不能因为其他原因决定刷新自己。见this reference,尤其是这个:

    在许多实现中,标准输出是行缓冲的,写入 '\n' 无论如何都会导致刷新

    【讨论】:

      【解决方案3】:

      如果在std::ostream 中看到的'\n' 触发刷新,它实际上取决于实现。

      强制且安全的方法是使用std::endl

      【讨论】:

        猜你喜欢
        • 2012-01-08
        • 2020-07-23
        • 2020-12-12
        • 2014-04-16
        • 2014-10-14
        • 1970-01-01
        • 2011-08-26
        • 2014-03-28
        相关资源
        最近更新 更多