buffer什么时候刷新
When does the buffer flush
对于cpp,我知道我们有3种情况来刷新缓冲区:
- 当我们得到
std::cin
- 当我们
std::cout<<std::endl
(或其他类似 endl
的东西)
- 当我们调用一些函数时
fflush
如果我说的对,还有一个问题:
如果我只在 main
和 运行 中写入 std::cout<<"hello world";
,我可以在控制台看到 "hello world"。那么,缓冲区由谁以及何时刷新?由编译器?或者缓冲区会在 main 完成时刷新?
您可能想阅读有关 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
.
的属性
遇到同样的问题,做了个小测试
int main() {
printf("t");
// fflush(stdout);
while(1);
return 0;
}
似乎没有 fflush
,什么也打印不出来。
随着同花顺,我的小"t"出现在控制台上。
所以,添加到之前的响应中,我相信刷新不会神奇地发生,而是在各种"events"的帮助下发生,例如当程序退出时,或者当缓冲区已满时。
帮我理解了很多。
对于cpp,我知道我们有3种情况来刷新缓冲区:
- 当我们得到
std::cin
- 当我们
std::cout<<std::endl
(或其他类似endl
的东西) - 当我们调用一些函数时
fflush
如果我说的对,还有一个问题:
如果我只在 main
和 运行 中写入 std::cout<<"hello world";
,我可以在控制台看到 "hello world"。那么,缓冲区由谁以及何时刷新?由编译器?或者缓冲区会在 main 完成时刷新?
您可能想阅读有关 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
.
遇到同样的问题,做了个小测试
int main() {
printf("t");
// fflush(stdout);
while(1);
return 0;
}
似乎没有 fflush
,什么也打印不出来。
随着同花顺,我的小"t"出现在控制台上。
所以,添加到之前的响应中,我相信刷新不会神奇地发生,而是在各种"events"的帮助下发生,例如当程序退出时,或者当缓冲区已满时。