printf缓冲区刷新问题

著论准过秦,作赋拟子虚。这篇文章主要讲述printf缓冲区刷新问题相关的知识,希望能为你提供帮助。


以下内容在Linux测试,Window因为没遵循POSIX,所以现象会有不同。
一、前言首先,printf缓冲区的问题,平时不大会发现,当时是在使用sleep函数时出现的。先来看一下问题。

#include < stdio.h>

int main()
{
printf("hello\\n");
sleep(1); //延迟1秒
printf("world\\n");
return 0;
}

上面的代码正常输出:
hello
world
两个之间间隔一秒输出
接下来做一下修改:
#include < stdio.h>

int main()
{
printf("hello"); /*去掉转义字符\\n*/
sleep(1);
printf("world\\n");
return 0;
}

上面的代码输出为:
helloworld
但是输出却是延迟一秒之后才将helloworld一起输出
当我们去掉转义字符‘\\n’,延迟函数sleep不再在语句间延迟,而是变成延迟整个程序。
二、深入理解printfprintf是一个行缓冲函数,先写到缓冲区,满足一定的条件后,才会将缓冲区内容输出到对应文件中,如下几个条件可以刷新缓冲区:
1 缓冲区填满。
2 写入的字符中有‘\\n’ , ‘\\r’。
3 调用fflush手动刷新缓冲区。
【printf缓冲区刷新问题】 4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新。
5 调用printf函数的进程或线程结束会调用fflush函数
接下来我们修改一下程序
include < stdio.h>

int main()
{
printf("hello");
fflush(stdout); //强制刷新缓存,输出显示
sleep(1);
printf("world\\n");

return 0;
}

这个时候的效果就是先输出hello,然后1秒之后再输出world。



    推荐阅读