【问题标题】:When does the buffer flush缓冲区何时刷新
【发布时间】:2015-08-10 15:48:31
【问题描述】:
对于cpp,我知道我们有三种情况来刷新缓冲区:
- 当我们得到
std::cin
- 当我们
std::cout<<std::endl(或其他类似endl)时
- 当我们调用像
fflush这样的函数时
如果我是对的,有一个问题:
如果我只是在main 中写std::cout<<"hello world"; 并运行它,我可以在控制台上看到“hello world”。那么,缓冲区由谁以及何时刷新?由编译器?或者当 main 完成时缓冲区会刷新?
【问题讨论】:
标签:
c++
buffer
cout
flush
【解决方案1】:
您可能想了解std::unitbuf 和std::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)
{
;
}
}
我知道无限 while 循环看起来有点傻,但它是我现在能想到的最简单、最便携的暂停代码的方法(不过我相信还有更好的方法!)。这样我就不会因为(1)代码终止,(2)被调用的析构函数和(3)等等而被刷新。这完全取决于std::cout 的属性。
【解决方案2】:
同样的问题,我做了一个小测试
int main() {
printf("t");
// fflush(stdout);
while(1);
return 0;
}
似乎没有fflush,什么都不会打印出来。
随着同花顺,我的小“t”出现在控制台上。
所以,加上前面的响应,我相信刷新不会神奇地发生,而是在各种“事件”的帮助下发生,例如程序退出时,或者缓冲区已满时。
This answer帮助我理解了很多。