在C中使用fflush()

时间:2020-02-23 14:32:03  来源:igfitidea点击:

在本文中,我们将研究如何在C语言中使用fflush()函数。

您可能不会立即清楚此功能的用途,但是您可能会从功能名称中得到提示。

C语言中的fflush()函数

fflush()函数(刷新到文件)是将任何输出流(或者更新流)的内容刷新到相应文件的函数。

fflush(file);

为什么我们需要此功能,而不仅仅是fprintf()或者printf()之类的功能?

答案是由于操作系统如何处理此输入。
无论何时传递任何输出,操作系统实际上都会将内容(最终将被写入输出文件的内容,例如" stdout")放入缓冲区。

仅在某些情况下,此缓冲区才会自动刷新到文件。

了解对fflush()的需求

为了说明由于输出缓冲而面临的一个常见问题,请考虑以下代码片段。

#include <stdio.h>

int main() {
  fprintf(stdout, "This is to stdout. ");
  fprintf(stderr, "This is to stderr. ");
  fprintf(stdout, "This is also to stdout. ");
}

您可能期望输出顺序良好,但实际情况有所不同。

This is to stderr. This is to stdout. This is also to stdout. 

为什么会这样?这是因为如何缓冲" stdout"和" stderr"的文件。

默认情况下," stdout"是换行缓冲的,而" stderr"是未缓冲的。

这是什么意思?对于" stdout",直到有换行符为止,输出流的内容实际上存储在临时缓冲区中。

仅当输出流遇到换行符(或者文件末尾)时,内容才会写入" stdout"文件。
注意我们的程序中缺少换行符!

但是,对于stderr,stderr流不会被缓冲,因此内容会立即写入其中!

因此,在示例程序中,由于我们没有换行符,因此将首先编写" stderr"。
只有到达文件末尾(输出)后,才会写入stdout的内容!

因此,如果要先输出stdout而不使用换行符,则必须使用fflush()刷新输出缓冲区。
说得通?

现在,在写入" stdout"之后添加" fflush()",以便将内容立即写入输出文件。

#include <stdio.h>

int main() {
  fprintf(stdout, "This is to stdout. ");
  //Flush the contents of the output stream immediately
  fflush(stdout);
  fprintf(stderr, "This is to stderr. ");
  //No need to flush stderr since it is un-buffered
  fprintf(stdout, "This is also to stdout. ");
  //Flush the contents of the output stream immediately
  fflush(stdout);
}

输出

This is to stdout. This is to stderr. This is also to stdout. 

确实,我们可以使用fflush()为我们解决问题!

我可以将fflush(stdin)用于输入流吗?

简短的答案是:不,永远不要使用此功能。

将缓冲的输出流刷新到文件的逻辑很有意义,因为我们知道输出内容最终将被写入文件/流

但是对于输入流,无法知道输入最终将其中结束。
就您所知,可能会有一些外部程序将输入随机地馈送到该程序,而您却无法知道它将发生什么!

因此,形式为fflush(stdin)的代码是未定义的行为!!!