C

时间:2016-05-31 05:31:16

标签: c filestream file-handling fflush

有人可以向我解释一下C中fpurge(FILE *stream)fflush(FILE *stream)之间的区别吗? fflush()fpurge()都会丢弃缓冲区中任何未写入或未读取的数据。 请解释一下这两者之间的确切区别以及它们的优缺点。

2 个答案:

答案 0 :(得分:4)

“...... fflushfpurge都会丢弃缓冲区中任何未写入或未读取的数据......”:否。

  • fflush

      

    函数fflush 通过流的底层写入函数强制写入给定输出或更新流的所有缓冲数据。流的打开状态不受影响。   如果stream参数为NULL,则fflush会刷新所有打开的输出流。

  • fpurge

      

    函数fpurge 删除给定流中缓冲的任何输入或输出。对于输出流,这会丢弃任何未写入的输出。对于输入流,这将丢弃从底层对象读取但尚未通过getc获取的任何输入。这包括通过ungetc推回的任何文字。 (P.S。:也存在__fpurge,它也是如此,但没有返回任何值)。

除了明显的对缓冲数据的影响之外,您会注意到与输入流之间的区别。你可以fpurge一个这样的流(虽然它通常是一个错误,可能是概念性的)。根据环境的不同,您可能不会fflush输入流(其行为可能未定义,请参阅man page)。除了上面提到的差异之外:1)它们导致错误的情况不同,并且2)fflush可以使用单个语句处理所有输出流,如上所述(这可能非常有用)。

至于优点和缺点,我不会引用任何...他们只是工作不同(大多数),所以你应该知道何时使用每一个。

除了功能之外(你要问的是什么),还有可移植性的区别:fflush是标准函数,而{{1不是(而fpurge也不是)。

您可以在此处找到相应的手册页(fflushfpurge)。

答案 1 :(得分:2)

首先,两个函数清除缓冲区可操作缓冲区的类型将在下面讨论,主要区别在于会发生什么缓冲区中存在数据。

  • 对于fflush(),数据被强制写入磁盘
  • 对于fpurge(),数据被丢弃

话虽如此,fflush()是一个标准的C函数,在C11章节§7.21.5.2中提到。

然而,fpurge()是一种非便携且非标准的功能。来自man page

  

这些功能是非标准的,不可移植。功能          fpurge()在4.4BSD中引入,在Linux下不可用。          函数__fpurge()是在Solaris中引入的,并且存在于          glibc 2.1.95及更高版本。

尽管如此,主要的使用方面差异是,

  • 使用输入流调用fflush()undefined behavior

      

    如果stream指向输出流或最新的输出流   未输入操作,fflush函数导致stream的任何未写入数据   要传递到主机环境以写入文件; 否则,行为是   未定义。

  • 定义了使用输入流调用fpurge()

      

    用于输入流      这会丢弃从底层对象读取的任何输入,但尚未丢弃      通过getc(3)获得;这包括通过推回的任何文本      ungetc(3)

尽管如此,请坚持fflush()