int fpurge()和int fflush()之间的区别C
任何人都可以请解释一下C中的fpurge(FILE *stream)
和fflush(FILE *stream)
之间的区别吗? fflush()
和fpurge()
都会丢弃缓冲区中的所有未写入或未读取的数据。 请解释这两者之间的确切区别,以及它们的优缺点。int fpurge()和int fflush()之间的区别C
要使用开始,两者的功能清楚缓冲器(类型可操作缓冲器的下面讨论),主要的区别是与存在于缓冲器中的数据会发生什么。
- 对于
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()
。
“......既fflush
和fpurge
将丢弃在缓冲......任何未写入或读数据”:第
-
fflush
:功能
fflush
部队通过流的底层写入函数为给定输出或更新流写入所有缓冲数据的。流的打开状态不受影响。 如果流参数为NULL
,则fflush
会刷新所有打开的输出流。 -
fpurge
:功能
fpurge
擦除给定的流中缓存的任何输入或输出。对于输出流,这会丢弃任何未写入的输出。对于输入流,这会丢弃从底层对象读取但尚未通过getc
获取的任何输入。这包括通过ungetc
推回的任何文字。 (P.S .:也存在__fpurge
,它也是这样做的,但没有返回任何值)。
除了明显作用,对缓冲数据,一个用在这里你会发现其中的差别是输入流。你可以用fpurge
这样一个流(虽然它通常是一个错误,可能是概念上的)。根据环境的不同,输入流可能不是fflush
(其行为可能未定义,请参阅man page)。除了上面所述的区别外:1)如上所述(这可能非常有用),它们导致错误的案例不同,并且2)fflush
可以用单个语句处理所有输出流。
至于利弊,我不会引用任何...他们只是工作不同(主要),所以你应该知道什么时候使用每个。
除了功能差(你问的是什么),还有一个便携区别:fflush
是一个标准的功能,而fpurge
不是(和__fpurge
不是非此即彼)。
从''fpurge()'](http://linux.die.net/man/3/fpurge)的Linux手册页判断,'fpurge()'的一个问题是它是非标准的,源自BSD 4.4,因此无处不在。 Mac OS X(BSD)手册页描述了'fpurge()',但没有提及它的出处 - 虽然它确实声称在同一页上列出了'fseek()',但符合标准C(推理) fpurge()'不。 –
另请参见[如何从Unix系统上的tty输入队列中刷新数据?](https://stackoverflow.com/questions/10938882/) –