一般而言,大家都知道printf是带有行缓冲的函数,printf把打印的消息先输出到行缓冲区,在以下几种情况下:1.程序结束时调用exit(0)/return;2.遇到回车\n,3.调用fflush函数;4.缓冲区满。会自动刷新缓冲区,缓冲区的内容显示到标准输出上。
比如在LINUX系统下,执行如下程序:
- #include <stdio.h>
- int main(void)
- {
- printf("hello");
- while(1);
- return 0;
- }
【2.WINDOWS系统下】
同样这段程序,如果在Windows下编译运行(使用VC++6.0),会发现控制台中马上看到hello的输出。分析原因发现,Windows下stdout没有提供缓冲(不知道这个原因是否确切)。比如执行如下程序:
- #include <stdio.h>
- int main(void)
- {
- printf("hello\n");
- printf("buf size is %d\n",stdout->_bufsiz);
- while(1);
- return 0;
- }
在Windows下,可以使用setbuf函数(https://msdn.microsoft.com/en-us/library/86cebhfs.aspx)来设置缓冲区的方式和大小。
- #include <stdio.h>
- char buf[512];
- int main(void)
- {
- setvbuf(stdout, buf, _IOLBF, 512);
- printf("hello");
- while(1);
- return 0;
- }
使用如下程序,查看缓冲区的大小,输出结果为512字节
- #include <stdio.h>
- char buf[512];
- int main(void)
- {
- setvbuf(stdout, buf, _IOLBF, 512);
- printf("hello\n");
- printf("%d\n",stdout->_bufsiz);
- fflush(stdout);
- while(1);
- return 0;
- }
此外,在Windows设置缓冲区的情况下,printf中使用回车符\n是不会刷新缓冲区的。对上述程序,把fflush函数注释掉,在VC++6.0中重新执行,控制台中看不到输出。