有人可以向我解释一下C中fpurge(FILE *stream)
和fflush(FILE *stream)
之间的区别吗?
fflush()
和fpurge()
都会丢弃缓冲区中任何未写入或未读取的数据。
请解释一下这两者之间的确切区别以及它们的优缺点。
答案 0 :(得分:4)
“...... fflush
和fpurge
都会丢弃缓冲区中任何未写入或未读取的数据......”:否。
fflush
:
函数
fflush
通过流的底层写入函数强制写入给定输出或更新流的所有缓冲数据。流的打开状态不受影响。 如果stream参数为NULL
,则fflush
会刷新所有打开的输出流。
fpurge
:
函数
fpurge
删除给定流中缓冲的任何输入或输出。对于输出流,这会丢弃任何未写入的输出。对于输入流,这将丢弃从底层对象读取但尚未通过getc
获取的任何输入。这包括通过ungetc
推回的任何文字。 (P.S。:也存在__fpurge
,它也是如此,但没有返回任何值)。
除了明显的对缓冲数据的影响之外,您会注意到与输入流之间的区别。你可以fpurge
一个这样的流(虽然它通常是一个错误,可能是概念性的)。根据环境的不同,您可能不会fflush
输入流(其行为可能未定义,请参阅man page)。除了上面提到的差异之外:1)它们导致错误的情况不同,并且2)fflush
可以使用单个语句处理所有输出流,如上所述(这可能非常有用)。
至于优点和缺点,我不会引用任何...他们只是工作不同(大多数),所以你应该知道何时使用每一个。
除了功能之外(你要问的是什么),还有可移植性的区别:fflush
是标准函数,而{{1不是(而fpurge
也不是)。
答案 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()
。