【发布时间】:2015-05-21 20:38:35
【问题描述】:
我实在看不懂:fflush()函数的用法,我能找到这个函数的一个好的实现吗?我阅读了一些关于它的资源,但我仍然不能很好地掌握它,实际上我想知道这个功能到底是做什么的?
【问题讨论】:
我实在看不懂:fflush()函数的用法,我能找到这个函数的一个好的实现吗?我阅读了一些关于它的资源,但我仍然不能很好地掌握它,实际上我想知道这个功能到底是做什么的?
【问题讨论】:
了解它的作用的最好方法是标准
7.21.5.2 fflush 函数
概要
#include <stdio.h> int fflush(FILE *stream);说明
如果
stream指向未输入最新操作的输出流或更新流,fflush函数会导致该流的任何未写入数据被传递到主机环境写入文件;否则,行为未定义。如果
stream是空指针,fflush函数会对上面定义行为的所有流执行此刷新操作。退货
fflush函数为流设置错误指示符,如果发生写入错误,则返回EOF,否则返回零。
所以基本上库 I/O 函数使用缓冲区,fflush() 将数据从缓冲区移动到 physical 文件,这就是为什么 fflush(stdin) 正如您可以从上面理解的那样是未定义的行为,因为fflush() 仅针对输出流定义。
上面的意思是,对输出流的写操作不会立即执行,它们是缓冲的,当你调用fflush()然后它们被刷新到磁盘,你不需要一直显式地fflush(),例如在
fpritnf(stdout, "Example text\n");
打印文本末尾的"\n" 会自动触发刷新,当您调用fclose() 或退出程序时也会刷新缓冲区。
您可能还注意到,即使对于输出流,也没有定义行为,除非最近的操作是 输出,否则无法刷新输入操作。
【讨论】:
引用C11 标准,第 7.21.5.2 章
int fflush(FILE *stream);如果
stream指向未输入最近操作的输出流或更新流,fflush()函数会导致该流的任何未写入数据被传递到主机环境以写入文件;否则,行为未定义。
因此,基本上,fflush(stream) 调用将强制(即使缓冲区未满)将缓冲区中与特定 stream 关联的所有数据刷新到 输出文件(磁盘)。
另外,作为注释,来自第 3 段,同一文档
如果
stream是一个空指针,fflush()函数会对上面定义了行为的所有流执行此刷新操作。
【讨论】:
fflush 是一种告诉它现在将缓冲区转储到磁盘的方法。
fflush 当您需要控制写入 stdio FILE 的输出何时实际变为可见时需要,因为 stdio 通常缓冲输出并将大块作为一个单元写入。对于不使用任何与 C 标准库之外的操作系统接口的基本 C 程序,您需要这种控制的主要/唯一时间是在交互式设备(屏幕/终端)上显示输出并且您想要确保它在那里物理可见。但是,在类 unix/POSIX 系统和其他具有多处理功能的环境中,您可能还希望确保将数据写出到其他进程可能需要读取的文件或管道中。
【讨论】:
当您使用例如FILE* 写信时fprintf(甚至printf,大约等于fprintf(stdout, ...))数据通常存储在缓冲区中。当缓冲区已满时,它会刷新(写入)到实际的输出文件中。
如果你想在缓冲区满之前将内容写入文件,你可以调用fflush,它就是这样做的。
【讨论】:
流可以被缓冲。这意味着在使用printf 或fprintf 之类的函数后,您发送的字符不会立即发送。相反,他们等待发送适当的情况。
这可能会产生一些问题,因为有时流最终通过可能需要很长时间。
出于这个原因,有一个命令fflush(FILE *stream) 强制流。
在 Unix 系统中,一个程序总是打开 3 个文件描述符:
stdin - 程序输入,缓冲stdout - 程序的输出,缓冲stderr - 错误消息的输出,无缓冲因此,当您使用描述符 stdout(printf 会这样做)并且您希望字符显示在前面时,请使用 fflush。
【讨论】: