c ++刷新缓冲区

时间:2015-01-12 20:41:49

标签: c++ buffer cout

我知道这里有很多缓冲问题,但我似乎无法找到明确的答案。

std::cout << "write to screen" << std::endl;

我知道这段代码会写入屏幕并刷新缓冲区因为“endl”,但如果我写了这个:

std::cout << "write to screen";

如果文本已输出到屏幕,是否不会刷新缓冲区?

4 个答案:

答案 0 :(得分:1)

std::cout << "Hello" << std::endl;
在执行下一行代码之前,

将写入屏幕,而

std::cout << "Hello\n";

将打印相同的内容,但是在程序正常退出之前的某个时间或者您使用std::cin(或另一个手动绑定到std::cout的内流)。这意味着如果您的程序突然终止或挂起无限循环,您可能根本看不到输出。

答案 1 :(得分:1)

  

不管文本是否输出到屏幕,都不会刷新缓冲区?

假设您已经看到输出到屏幕的文本,然后,则刷新了缓冲区。

我认为混淆是关于这一行:

std::cout << "write to screen";

缺少std::endl 并不意味着&#34;不要刷新缓冲区&#34;。它只是意味着&#34;我没有说什么时候刷新缓冲区&#34;。

答案 2 :(得分:1)

有多种方法可以确保std::ostream被刷新:

  1. 手动std::endlstd::flush或直接致电ostream::flush()
  2. 取决于以后使用的输入流绑定到您的ostream:std::basic_ios::tie()
  3. 取决于与C流的关联:std::ios_base::sync_with_stdio

    这意味着任何能够刷新相应C流的内容也会刷新C ++流,如调用fflush()或(可能是自动)选择的缓冲策略。
    像线缓冲一样。

    从C11草稿:

      

    7.21.3档案

         

    3当流 unbuffered 时,字符应从源或在   目的地尽快。否则可能会累积字符   作为块传输到主机环境或从主机环境传输。当流完全缓冲时,   字符旨在作为块时传输到主机环境或从主机环境传输   填充缓冲区。当流行缓冲时,字符应该是   当换行字符时,作为块发送到主机环境或从主机环境发送   遇到。此外,字符旨在作为块传输到主机   填充缓冲区时,在无缓冲流上请求输入时的环境,或   当在需要传输的线路缓冲流上请求输入时   来自主机环境的字符。支持这些特征是   实现定义,可能会受到setbuf和setvbuf函数的影响   7在程序启动时,预定义了三个文本流,无需显式打开    - 标准输入(用于读取传统输入),标准输出(用于写入   常规输出)和标准错误(用于写入诊断输出)。最初   打开后,标准错误流未完全缓冲;标准输入和标准   当且仅当可以确定流不被引用时,输出流被完全缓冲   到交互设备。

  4. 等待内部缓冲区溢出。
  5. 现在,作为一般指导原则:不要手动清除流,否则会严重降低性能。当然,除非它是正确性的必要条件。

答案 3 :(得分:0)

  

&#34;无论文本是否已输出到屏幕,都不会刷新缓冲区?&#34;

没有! std::endl意味着潮红。底层缓冲区不会刷新(写在屏幕上),  直到达到某个水印(缓冲区大小)。

如果您想要刷新它,请明确地致电cout.flush()

std::cout << "write to screen";
std::cout.flush();

解决方案的真正关键是底层的 std::basic_streambuf 接口实际实现了什么。
可能有各种实现:

  1. 每次点击底层缓冲区的某个水印时调用flush()
  2. 每次致电flush()(效率不高)
  3. flush()打印后立即致电'\n'
  4. 使用flush()
  5. 致电std::endl

    内部缓冲区管理不应成为您关注的业务,除非您尝试提供自己的std::basic_streambuf实施。