printf()函数什么时候刷新缓存
2017-07-23 18:31
316 查看
大家应该都知道,printf(),是先将格式化好的信息先输到缓冲区上,因为输入输出的缓存为行缓存,所以当填满I/O缓存后,才进行实际I/O操作或者遇到换行符‘\n’(或者执行fflush、floce、exit、return),缓存大小为1K。
请看如下程序:
编译运行后:
咦!编译运行后发现,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
请看如下程序:
#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
相关文章推荐
- 实验1-2 printf函数的使用
- 使用GetProcessHeaps()和HeapValidate()函数定位缓存溢出
- C/C++ 之 printf 输出函数的使用
- php 缓存函数代码
- 知识点摸清 - - function()——JavaScript 函数名后什么时候加括号,什么时候不
- ios添加缓存后界面刷新崩溃问题
- C语言printf函数输出表达式中的计算顺序
- printf 函数返回值
- 刷新函数小结
- Swift网络请求,数据模型,图片缓存,自动布局,上拉刷新下拉加载
- C 【printf 和 scanf 函数的使用】
- seajs添加版本号刷新本地缓存的方法
- 详解U-Boot中printf函数的实现
- jquery刷新页面 页面跳转 js常用函数
- Win/CentOS/MacOS Chrome/Firefox/IE/Safari DNS缓存时间与刷新
- 在Myeclipse中修改了HTML、CSS或JavaScript语句,但是浏览器刷新并清空缓存后依然不显示新内容
- 微擎数据库缓存的增、删、改和查函数详解
- printf函数详解
- C语言stdio.h中printf函数输出‘12’结果理解
- printf函数