C语言:fflush()的用法以及缓冲区的概念

int fflush()函数

fflush()函数的原型如下:

int  fflush()(file * fp)

主要用到这俩个部分:

fflush(stdio):清空输入缓冲区

fflush(stdout):清空输出缓冲区

我们输入输出的内容都会先放到输入输出缓冲区中,那么先认识一下缓冲区。

1、什么是缓冲区?

缓冲区就是我们常说的缓存,属于内存的一部分。它依据对应的输入设备和输出设备把内存的一部分空间分为输入缓冲区和输出缓冲区

2、为什么会有缓冲区?

一句话:减少对磁盘的读写次数,提高计算机的运行效率。系统调用时需要时间的,程序中频繁的使用系统调用会降低程序的运行效率 ,库函数访问文件的时候根据需要,设置不同类型的缓冲区,从而减少了直接调用IO系统调用的次数,也就提高了效率

3.缓冲区的分类

全缓冲、行缓冲、不带缓冲

1.全缓冲 :填满I/O缓存后进行实际的I/O操作 				eg:磁盘的读写

(2.行缓冲 :输入输出遇到换行符时执行真正的I/O操作        eg:键盘的输入

(3.不带缓冲 :直接进行显示,相当于直接刷新数据。		    eg:stderr错误信息快速输出到标准错误文件中

fflush(stdin)的使用过程分析

int main()
{
    char a,b;
	printf("请输入俩个字符:n");
    scanf("%c",&a);
    //fflush(stdin);//假设不使用fflush
    scanf("%c",&b);
    printf("第一个字符:%cn第二个字符:%c",a,b);
}

在这里插入图片描述

这很惊讶,但是仔细想想好像也正常。毕竟换行符也是一个字符。程序把换行符也当成了一个字符赋给了变量b.可是这并非我们本意,怎么解决呢?这个时候fflush(stdin),就大显神威。接下来说一下详细过程,把1写进缓冲区,n也写进缓冲区,然后scanf()挑选走了1,缓冲区留下了n,使用fflush(stdin),又清除了n,此时再次输入2和n,scanf()挑选走了2.所以也就打印出了1和2.

fflush(stdout)的使用过程和分析如下

int main()
{
	int a[5]={1,2,3,4,5};
    for(int i=0;i<5;i++){
        printf("第%d个数是:%dn",i+1,a[i]);
        fflush(stdout);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-My9m7KqT-1656838683628)(C:Users联想AppDataRoamingTyporatypora-user-imagesimage-20220629003230921.png)]

这好像挺正常,确实最终的结果是一样的,不一样的是内部的逻辑。

作用:调用printf()时,输出的结果一般会被标准库缓存起来,可能不会及时打印写出到输出设备上面,此时就可以用fflush(stdout)强制把缓存内容进行`输出。

不加fflush(stdout):调用了printf后,把1,2,3,4,5值都放到了输出缓冲区里,最后一次性进行了显示

加了fflush(stdout):调用了printf后,把1,2,3,4,5值每次放一个就输出一个,相当于着5个值从输出缓冲区一个一个蹦出来的。只是人眼看起来打印一样。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>