【问题标题】:Why / when is cout buffer automatically flushed?为什么/何时自动刷新 cout 缓冲区?
【发布时间】:2020-04-06 04:16:36
【问题描述】:

我从here 了解到,如果我要在不刷新缓冲区的情况下输出字符(使用 endlcin ),它们在程序结束之前不会出现在我的控制台上。

所以我尝试做一个无限循环:

for(;;)
{
    std::cout << "a" << std::endl;
}

同样不刷新缓冲区:

for(;;)
{
    std::cout << "a";
}

它们都永远输出a,我能观察到的唯一区别是后一个版本的代码在开始输出字母之前有一些延迟时间。第一个立即开始。

我希望第二个只有在循环中有 break 时才输出字符,并且程序将被终止。

【问题讨论】:

  • 不,它会在刷新之前填满缓冲区。缓冲区的大小不是无限的。
  • “在程序结束之前它们不会出现在我的控制台上” - 或者直到缓冲区已满..

标签: c++ buffer cout


【解决方案1】:

您是正确的,std::endl 或使用std::cin 会导致发生刷新,并立即输出内容。 std::endl 等同于 std::cout.put('\n'); std::cout.flush();,其中 std::cinstd::cerrtie()d 到 std::cout,因此对其中任何一个的任何操作都会为您执行 std::cout.flush()

但是,在第二种情况下,std::cout 仍然有一个基础输出序列(std::streambuf),它是一个指定的大小。一旦此缓冲区已满,流将自动刷新,您将输出到控制台。用你提到的延迟时间来填满这个缓冲区。

【讨论】:

    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2022-10-02
    • 2015-08-10
    • 1970-01-01
    • 2018-07-03
    • 2013-02-09
    相关资源
    最近更新 更多