缓冲区何时刷新

时间:2015-05-28 08:42:39

标签: c++ buffer cout flush

对于cpp,我知道我们有三种情况来刷新缓冲区:

  1. 当我们得到std::cin
  2. 当我们std::cout<<std::endl(或endl之类的东西)
  3. 当我们调用fflush
  4. 之类的函数时

    如果我是对的,那就有一个问题:
    如果我只是在std::cout<<"hello world";中编写main并运行它,我就可以看到&#34; hello world&#34;在控制台。那么,由谁和何时缓冲区刷新?通过编译器?或者当主要完成时缓冲区将刷新?

2 个答案:

答案 0 :(得分:1)

您可能希望了解std::unitbufstd::nounitbuf。这是一个不错的reference

使用一些简单的例子可能会有所帮助。例如,以下代码将不会打印Hello world,因为在任何输出操作之后不会自动刷新输出流:

示例1

#include<iostream>

int main()
{
    // ----- Don't want automatic flushing ------
    std::cout << std::nounitbuf;
    std::cout << "Hello world";

    while (1)
    {
        ;
    }
}

这个代码示例确实会打印Hello world,因为我指定要启用自动刷新功能:

示例2

#include<iostream>

int main()
{
    // ----- I do want automatic flushing ------
    std::cout << std::unitbuf;
    std::cout << "Hello world";

    while (1)
    {
        ;
    }
}

我知道infiite while循环看起来有点傻,但它是暂停我现在能想到的代码的最简单,最便携的方式(我确定在那里)但是更好的方法!)。这样我就不会因为(1)代码终止,(2)调用析构函数和(3)等而进行刷新。这完全取决于std::cout的属性。

答案 1 :(得分:0)

在同一问题上S绊绊,我做了一点测试

select max(score) 
from course_score

似乎没有 select student_id,max(score) from course_score group by student_id ,什么都没有打印出来。 刷新后,我的小“ t”出现在控制台上。

因此,除了前一个响应之外,我相信刷新并不是神奇的事情,而是借助各种“事件”,例如在程序退出时或缓冲区已满时。

This answer帮助我很多了。