有人能解释一下C中fpurge(FILE *stream)
和fflush(FILE *stream)
的区别吗?fflush()
和fpurge()
都将丢弃缓冲器中任何未写入或未读取的数据。请给我解释一下这两者之间的确切区别,以及它们的优缺点。
"…fflush
和fpurge
都将丢弃缓冲区中任何未写入或未读取的数据…":否。
-
fflush
:函数
fflush
通过流的底层写入函数强制写入给定输出或更新流的所有缓冲数据。流的打开状态不受影响。如果流参数为NULL
,则fflush
将刷新所有打开的输出流。 -
fpurge
:函数
fpurge
擦除给定流中缓冲的任何输入或输出。对于输出流,这将丢弃任何未写入的输出。对于输入流,这将丢弃从底层对象读取但尚未通过getc
获得的任何输入。这包括通过ungetc
推送的任何文本。(附言:也存在__fpurge
,它做同样的事情,但不返回任何值)。
除了对缓冲数据的明显影响之外,您会注意到差异的一个用途是输入流。您可以fpurge
一个这样的流(尽管这通常是一个错误,可能是概念性的)。根据环境的不同,您可能不会将fflush
作为输入流(其行为可能未定义,请参阅手册页)。除了上述差异之外:1)它们导致错误的情况是不同的,2)fflush
可以用一条语句处理所有输出流,如上所述(这可能非常有用)。
至于利弊,我不会引用任何。。。它们只是工作方式不同(大部分),所以你应该知道何时使用它们。
除了功能性的差异(您所问的),还有 可移植性这里有各自的手册页(fflush
、fpurge
)。
首先,两个函数清除缓冲区(可操作缓冲区的类型在下面讨论),主要区别在于缓冲区中的数据会发生什么。
- 对于
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()
。