【问题标题】:How to flush buffer manually?如何手动刷新缓冲区?
【发布时间】:2021-09-03 17:29:24
【问题描述】:

this is same Question 但没有正确回答。

代码

#include<iostream>
int main()
{
    char ch='a';
    std::cout<<ch;
}

输出

a

所以这里在输出流中只有一个字符会导致缓冲区。所以缓冲区还没有满,它仍然在屏幕上显示输出。表示缓冲区会自动刷新。

所以请举例说明缓冲区不会自动刷新,我们必须使用操纵器标志flush

【问题讨论】:

  • 是什么让你认为这是冲洗?剩余的缓冲区只是在程序结束时打印
  • @AlanBirtles 但如果我将getch() 包含在程序的最后一条语句中。仍然在此之前执行它打印输出为a
  • 如果你开始一个输入操作,输出会被故意刷新
  • @AlanBirtles 哦。但是我怎样才能看到缓冲区没有被刷新?

标签: c++ buffer flags flush manipulators


【解决方案1】:

您可以通过在输出之间休眠来查看您的流是否被缓冲,例如:

#include <iostream>
#include <thread>

int main()
{
    for (int i = 0; i < 50; i++)
    {
        char ch = 'a';
        std::cout << ch << "\n";
        std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
}

在某些平台上,您可能需要通过调用 setvbuf 来启用 stdout 上的缓冲:

std::setvbuf(stdout, nullptr, _IOFBF, BUFSIZ);

【讨论】:

  • 我检查了您的代码,但在打印a 后屏幕停止了 500 秒。第一个 a 在代码运行后打印。
  • 你给setvbuf打过电话吗?
  • 是的,它正在工作。谢谢。你能解释一下setvbuf 究竟在做什么或任何解释它的文章。我在 cppreference 上查过,但我不明白。
  • 它启用缓冲
  • 所以在某些平台上缓冲不会发生,我们必须启用它。表示std::cout&lt;&lt;ch 它不会等待缓冲区满,只是在屏幕上打印它,对吗?
猜你喜欢
  • 2010-09-20
  • 1970-01-01
  • 2015-08-10
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多