2016-05-31 181 views
6

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

+0

从''fpurge()'](http://linux.die.net/man/3/fpurge)的Linux手册页判断,'fpurge()'的一个问题是它是非标准的,源自BSD 4.4,因此无处不在。 Mac OS X(BSD)手册页描述了'fpurge()',但没有提及它的出处 - 虽然它确实声称在同一页上列出了'fseek()',但符合标准C(推理) fpurge()'不。 –

+0

另请参见[如何从Unix系统上的tty输入队列中刷新数据?](https://stackoverflow.com/questions/10938882/) –

回答

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()

+2

输入流上的'fflush'可能由ISO C保留而未定义,但它由POSIX指定。这个效果与'fpurge'引用的效果类似,只是它只能处理* seekable *输入流 - 即它可以用来确保陈旧的数据没有从磁盘文件中缓存,但不能丢弃从管道或tty缓存的数据。 – hobbs

+0

Ref:http://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html – hobbs

+0

@hobbs对,但仍然是实现定义。 –

4

“......既fflushfpurge将丢弃在缓冲......任何未写入或读数据”:第

  • fflush

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

  • fpurge

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

除了明显作用,对缓冲数据,一个用在这里你会发现其中的差别是输入流。你可以用fpurge这样一个流(虽然它通常是一个错误,可能是概念上的)。根据环境的不同,输入流可能不是fflush(其行为可能未定义,请参阅man page)。除了上面所述的区别外:1)如上所述(这可能非常有用),它们导致错误的案例不同,并且2)fflush可以用单个语句处理所有输出流。

至于利弊,我不会引用任何...他们只是工作不同(主要),所以你应该知道什么时候使用每个。

除了功能差(你问的是什么),还有一个便携区别:fflush是一个标准的功能,而fpurge不是(和__fpurge不是非此即彼)。

这里您有相应的手册页(fflush,fpurge)。

相关问题