C语言 fflush和stdin stdout stderr之间的联系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/tonglin12138/article/details/85546563

写在前面:

阅读这篇文章前,读者应该大致了解C语言“缓冲区”的概念,在前面的文章中有详细介绍。

**Stdin:** 是标准输入,一般指键盘输入到缓冲区里的东西。
**Stdout:** C语言中的 stdout 是一个定义在<stdio.h>的宏(macro),它展开到一个 FILE* (“指向 FILE 的指针”)类型的表达式(不一定是常量),这个表达式指向一个与标准输出流(standard output stream)相关连的 FILE 对象。
**stderr:** 【unix】标准输出(设备)文件,对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。在C中,程序执行时,一直处于开启状态。

        敲黑板了,同志们,以上是百度百科给出的解释,相信会有人和我一样还是似懂非懂的样子。OK,下面我来具体介绍:

         我们在写C程序时经常遇到printf(),fprintf(),perror(),这些东西到底有什么作用。说到这不得不提及stdin,stdout,stderr。想想,我们在用C去写文件时的操作:

 File *fp=fopen();

定义一个指向文件流的指针,通过操作这个指针你就能进行文件读写,打开关闭。
其实,stdin,stdout,stderr就是这个fp,不过他是随着计算机系统的开启默认打开的,其中0就是stdin,表示输入流,指从键盘输入,1代表stdout,2代表stderr,1,2默认是显示器。printf()其实就是向stdout中输出,等同于fprintf(stdout,“xxx”),perror()其实就是向stderr中输出,相当于fprintf(stderr,“xxx”),那到底stdout,和stderr有什么区别和作用呢?
        stderr,和stdout重要的一点区别,stderr是没有缓冲的,它立即输出,而stdout默认是行缓冲,也就是它遇到‘\n’,才向外输出内容,如果你想stdout也实时输出内容,那就在输出语句后加上fflush(stdout),这样就能达到实时输出的效果。
谈到这里,我们趁热打铁认识一下fflush()函数。

FFLUSH函数:

fflush是一个计算机函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。

函数原型:int fflush(FILE *stream) ;

函数功能:清除一个流,即清除文件缓冲区.

常用场合:

一、fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
二、scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结 束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
键盘缓冲区就可能有残余信息问题。
scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中
解决就要在scanf()函数之后加个fflush(stdin)
三、写文件的时候 不会马上进行物理磁盘的文件读写,而是先写入缓存,当缓存中内容达到一定程度后再写

FILE *fp=fopen("a.txt","w");
fprintf(fp,"abcdef");
fflush(fp);

大家可以回想一下之前介绍过的“进度条”小程序,就会发现里边在每一次在循环体的最后,都要进行fflush(stdout)一下。这时候,大家应该就会明白这个操作的含义了:没错,就是因为stdout默认是行缓冲,所以没有遇到‘\n’之前,我们必须要手动的将缓冲区的内容刷到屏幕上来*()*

猜你喜欢

转载自blog.csdn.net/tonglin12138/article/details/85546563