C中int fpurge()和int fflush()之间的差异



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

"…fflushfpurge都将丢弃缓冲区中任何未写入或未读取的数据…":否。

  • fflush:

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

  • fpurge:

    函数fpurge擦除给定流中缓冲的任何输入或输出。对于输出流,这将丢弃任何未写入的输出。对于输入流,这将丢弃从底层对象读取但尚未通过getc获得的任何输入。这包括通过ungetc推送的任何文本。(附言:也存在__fpurge,它做同样的事情,但不返回任何值)。

除了对缓冲数据的明显影响之外,您会注意到差异的一个用途是输入流。您可以fpurge一个这样的流(尽管这通常是一个错误,可能是概念性的)。根据环境的不同,您可能不会将fflush作为输入流(其行为可能未定义,请参阅手册页)。除了上述差异之外:1)它们导致错误的情况是不同的,2)fflush可以用一条语句处理所有输出流,如上所述(这可能非常有用)。

至于利弊,我不会引用任何。。。它们只是工作方式不同(大部分),所以你应该知道何时使用它们。

除了功能性的差异(您所问的),还有

可移植性这里有各自的手册页(fflushfpurge)。

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

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

也就是说,fflush()是一个标准的C函数,如C11第7.21.5.2章所述。

fpurge()是一个不可移植的非标准函数。从手册页

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

也就是说,主要的使用方面的区别是,

  • 使用输入流调用fflush()是未定义的行为。

    如果stream指向一个输出流或更新流操作未输入,fflush函数会导致该stream的任何未写入数据以被传送到主机环境以被写入文件否则,行为为未定义

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

    对于输入流这将丢弃从基础对象读取的任何输入,但尚未丢弃通过CCD_ 36获得;这包括通过ungetc(3)

尽管如此,还是要坚持使用fflush()

相关内容

  • 没有找到相关文章

最新更新