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

时间:2014-02-24 19:36:33

标签: c file

为什么fflush()不被视为安全?我被告知它显示未定义的行为?如果是这样,fflush()的替代方法是什么?

2 个答案:

答案 0 :(得分:7)

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

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

  

如果流指向输出流或其中的更新流   最近的操作没有输入,fflush功能导致任何   要传递到主机环境的该流的未写入数据   写入文件;否则,行为未定义。

后来,该标准将此明确包含在“未指定的行为”中:

  

fflush功能的流指向输入流或指向   更新流,其中输入了最近的操作

答案 1 :(得分:5)

你误解了。

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

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

在输入流上调用fflush的某些情况下,您应该实际读取并丢弃输入字符,例如,您会看到换行符'\n'EOF。或者,通常更好,使用fgets或类似的东西一次读取整行,然后解析输入。