为什么fflush()
不被视为安全?我被告知它显示未定义的行为?如果是这样,fflush()的替代方法是什么?
答案 0 :(得分:7)
你可能被告知fflush(stdin)
未定义,这是正确的。但fflush
是您想要刷新的其他流的方法,例如stdout
。
为了澄清,必须将流用于输出。标准说:
如果流指向输出流或其中的更新流 最近的操作没有输入,fflush功能导致任何 要传递到主机环境的该流的未写入数据 写入文件;否则,行为未定义。
后来,该标准将此明确包含在“未指定的行为”中:
fflush功能的流指向输入流或指向 更新流,其中输入了最近的操作
答案 1 :(得分:5)
你误解了。
就C标准而言,在输入流上调用fflush()
具有未定义的行为某些系统和/或辅助标准(如POSIX)可能会定义其行为,但是,在可移植的代码中依赖它并不是一个好主意。
在输出流上调用fflush()
,例如fflush(stdout)
,非常安全且定义良好。它会导致任何挂起的输出传递到操作系统(这不能保证它将被传送到物理输出设备)。
在输入流上调用fflush
的某些情况下,您应该实际读取并丢弃输入字符,例如,您会看到换行符'\n'
或EOF
。或者,通常更好,使用fgets
或类似的东西一次读取整行,然后解析输入。