您的位置:首页 > 其它

printf()函数什么时候刷新缓存

2017-07-23 18:31 316 查看
大家应该都知道,printf(),是先将格式化好的信息先输到缓冲区上,因为输入输出的缓存为行缓存,所以当填满I/O缓存后,才进行实际I/O操作或者遇到换行符‘\n’(或者执行fflush、floce、exit、return),缓存大小为1K。

请看如下程序:

#include <stdio.h>
int main(int argv,const char *argv[])
{
int n;
printf("inputs:");
scanf("%d",&n);
printf("%d\n",n);
return 0;
}


编译运行后:

root@linux:~/test# ./a.out
input:

咦!编译运行后发现,input:怎么被刷新出来了,根据以上的逻辑不是只有遇到换行符‘\n’(或者执行fflush、floce、exit、return)才会从缓存中刷新出来吗?怎么会从缓存中刷新出来打印到屏幕上呢?

那是因为scanf()函数在缓存里面读数据时,会先将缓存区刷新,然后再读取数据。

不止scanf()这个函数在缓存里面读数据时,会先将缓存区刷新,还有getc()、gets()、fgetc()、fgets()这几个读取数据时,也会会先将缓存区刷新,然后再读取数据。当然gets()是不建议使用的,就差被逐出标准了。

缓存类型:

全缓存:当填满I/O缓存后才进行实际I/O操作(或者执行fflush、flose、exit、return),4K大小

行缓存:当填满I/O缓存后才进行实际I/O操作或者遇到新航服‘\n’(或者执行fflush、floce、exit、return),1K大小

无缓存:标准错误输出strerr
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  printf 缓存