我真的无法理解:fflush()
函数的使用,我能找到一个很好的函数实现吗?我读了一些关于它的资源,但我还是不能很好地掌握它,实际上我想知道这个函数到底做了什么?
答案 0 :(得分:2)
引用C11
标准,第7.21.5.2章
int fflush(FILE *stream);
如果
stream
指向输入流或未输入最新操作的更新流,则fflush()
函数会将该流的任何未写入数据传递到主机环境被写入文件;否则,行为未定义。
所以,基本上,fflush(stream)
调用强制(即使缓冲区未满)也会清除与该特定{{1}相关联的缓冲区中存在的任何数据到输出文件(磁盘)。
另外,作为注释,来自第3段,同一文件
如果
stream
是空指针,stream
函数会对上面定义了行为的所有流执行此刷新操作。
答案 1 :(得分:2)
了解它的作用的最佳方式是标准
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()
或退出程序时,刷新缓冲区。
您可能还会注意到,即使输出流没有定义行为,除非最近的操作是输出,否则无法刷新输入操作。
答案 2 :(得分:1)
fflush
的输出实际可见时,需要 FILE
,因为stdio通常会缓冲输出并将大块写入一个单元。对于不使用C标准库之外的操作系统的任何接口的基本C程序,您需要这种控制的主/唯一时间是在交互设备(屏幕/终端)上显示输出并且您想要确保它在那里可见。但是,在unix-like / POSIX系统和其他具有多处理功能的环境中,您可能还希望确保将数据写出到其他进程可能需要读取的文件或管道。
答案 3 :(得分:1)
当您使用例如FILE*
写信时fprintf
(或甚至大约等于printf
的{{1}})数据通常存储在缓冲区中。缓冲区已满时,刷新(写入)到实际输出文件。
如果你想在之前将缓冲区的内容写入文件已满,你可以调用fprintf(stdout, ...)
就可以了。
答案 4 :(得分:1)
可以缓冲流。这意味着在使用printf
或fprintf
这样的函数后,您发送的字符不会立即显示。相反,他们会等待发送适当的情况。
这可能会产生一些问题,因为最终可能需要很长时间才能完成流。
出于这个原因,有一个命令fflush(FILE *stream)
强制流。
在Unix系统中,程序总是打开3个文件描述符:
stdin
- 输入您的程序,缓冲stdout
- 您的程序输出,缓冲stderr
- 输出错误消息,无缓冲因此,当您使用描述符stdout
(printf
这样做)并且您想要确保字符显示在前方时,请使用fflush
。