fflush和标准输入与输出

Posted 张同学吧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fflush和标准输入与输出相关的知识,希望对你有一定的参考价值。

什么是fflush

定义

fflush是一个在C语言标准输入输出库中的函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。

标准输入与输出

先说一下什么是stdin和stdout,以便下面内容的理解。
执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

fflush的返回值

在MSDN中这样描述:

Return Value

fflush returns 0 if the buffer was successfully flushed. The value 0 is also returned in cases in which the specified stream has no buffer or is open for reading only. A return value of EOF indicates an error.
Note If fflush returns EOF, data may have been lost due to a write failure. When setting up a critical error handler, it is safest to turn buffering off with the setvbuf function or to use low-level I/O routines such as _open, _close, and _write instead of the stream I/O functions.

翻译结果:如果缓冲区已成功刷新,则Fflush返回0。 当指定的流没有缓冲区或仅供读取时,也会返回值0。 返回值EOF表示错误。

注意如果fflush返回EOF,说明写失败可能导致数据丢失。 在设置关键错误处理程序时,最安全的做法是使用setvbuf函数关闭缓冲,或者使用_open、_close和_write等低级I/O例程来代替流I/O函数。

但是C和C++的标准里从来没有定义过 fflush(stdin)。
也许有人会说:“可是我用 flush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能,因为标准中根本没有定义fflush(stdin)。
MSDN 文档里也清楚地写着:
fflush on input stream is an extension to the C standard (fflush 操作输入流是对C标准的扩充)。说明他是一个扩充的函数。

用法:

int fflush(FILE *stream);
如果stream指向输出流或者更新流(update stream),并且这个更新流最近执行的操作不是输入,那么fflush函数将把任何未被写入的数据写入stream指向的文件(如标准输出文件stdout)。否则,fflush函数的行为是不确定的。fflush(NULL)清空所有输出流和上面提到的更新流。如果发生写错误,flush函数会给那些流打上错误标记,并且返回EOF,否则返回0。
fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准]
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上
fflush(),对上面定义了行为的所有流执行此刷新操作。

以上是关于fflush和标准输入与输出的主要内容,如果未能解决你的问题,请参考以下文章

fsync与fflush的关系和区别

fsync与fflush的关系和区别

编程拾穗

搞懂 fflush(stdout)

解决linux下fflush(stdin)无效

解决linux下fflush(stdin)无效