对于cpp,我知道我们有三种情况来刷新缓冲区:
std::cin
std::cout<<std::endl
(或endl
之类的东西)fflush
如果我是对的,那就有一个问题:
如果我只是在std::cout<<"hello world";
中编写main
并运行它,我就可以看到&#34; hello world&#34;在控制台。那么,由谁和何时缓冲区刷新?通过编译器?或者当主要完成时缓冲区将刷新?
答案 0 :(得分: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)
{
;
}
}
我知道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帮助我很多了。