C 为什么fflush()不被认为是安全的?

C 为什么fflush()不被认为是安全的?,c,file,C,File,为什么fflush()不安全?有人告诉我,它显示出未定义的行为?如果是这样,那么fflush()的替代方案是什么?您可能被告知fflush(stdin)未定义,这是正确的。但是fflush是您想要刷新的其他流的方法,例如stdout 为了澄清,流必须用于输出。标准上说: 如果流指向输出流或更新流,则 未输入最近的操作,fflush函数会导致 要传递到主机环境的流的未写入数据 写入文件;否则,行为是未定义的 后来,该标准明确将其包括为“未指定行为”: fflush函数的流指向输入流或 更新输入了最

为什么
fflush()
不安全?有人告诉我,它显示出未定义的行为?如果是这样,那么fflush()的替代方案是什么?

您可能被告知
fflush(stdin)
未定义,这是正确的。但是
fflush
是您想要刷新的其他流的方法,例如
stdout

为了澄清,流必须用于输出。标准上说:

如果流指向输出流或更新流,则 未输入最近的操作,fflush函数会导致 要传递到主机环境的流的未写入数据 写入文件;否则,行为是未定义的

后来,该标准明确将其包括为“未指定行为”:

fflush函数的流指向输入流或 更新输入了最新操作的流

你误解了

就C标准而言,在输入流上调用
fflush()
具有未定义的行为。某些系统和/或二级标准(如可能定义其行为)可能会定义其行为,但在旨在可移植的代码中依赖于该行为不是一个好主意

在输出流上调用
fflush()
,例如
fflush(stdout)
,是完全安全且定义良好的。它会导致将任何挂起的输出传送到操作系统(这并不保证它会传送到物理输出设备)


在某些情况下,如果对输入流调用了
fflush
,则实际上应该读取并丢弃输入字符,直到看到换行符
“\n”
EOF
。或者,最好使用
fgets
或类似的方法,一次读取一整行,然后解析输入。

+1只要最后一个操作是
out
,而不是
in
(无论如何,我记得。我还记得,从
out
in
操作的中间转换需要
fflush()
或seek-op。如果我记错了,我会提前道歉,因为我很少发现自己在全ii模式下操作文件。但我的大学教授告诉我,这没问题,我非常困惑,因为它可以很好地处理输入流also@Bayant_singh如果你的大学教授教你ing一个只输入的流是很好的,你不是唯一一个应该寻求教育的人。它可能在你的平台上“起作用”,但不要指望它作为一个基于语言标准的规则“起作用”。@Bayant\u singh:
fflush(stdin)的行为
不是由C语言标准定义的。它是由第二个POSIX标准定义的;请参阅我答案中的链接。但是,即使您希望依赖POSIX定义,大多数情况下,
fflush(stdin)
是通过读取和丢弃字符来更好地处理使用的。downvoter是否愿意发表评论?Drive by downvoter:我为你担心。现在来发表评论,我们可能仍然能够帮助你。