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