【发布时间】:2014-03-26 16:16:06
【问题描述】:
为什么fflush() 不安全?我被告知它显示了未定义的行为?如果是这样,fflush() 的替代方法是什么?
【问题讨论】:
为什么fflush() 不安全?我被告知它显示了未定义的行为?如果是这样,fflush() 的替代方法是什么?
【问题讨论】:
您可能被告知 fflush(stdin) 未定义,这是正确的。但是fflush 是您想要刷新的其他流的方式,例如stdout。
为了澄清,流必须用于输出。标准说:
如果流指向输出流或更新流,其中 没有输入最近的操作,fflush 函数会导致任何 该流的未写入数据将被传递到主机环境 写入文件;否则,行为未定义。
后来该标准将其明确包含为“未指定的行为”:
fflush 函数的流指向一个输入流或一个 更新输入最近操作的流
【讨论】:
你误会了。
在输入流上调用fflush()就 C 标准而言具有未定义的行为一些系统和/或二级标准,例如 POSIX 可能会定义它的行为,但它不是在旨在可移植的代码中依赖它是个好主意。
在输出流上调用fflush(),例如fflush(stdout),是完全安全且定义明确的。它会导致任何挂起的输出被传送到操作系统(不保证它会被传送到物理输出设备)。
在某些情况下,在输入流上调用fflush,您实际上应该读取并丢弃输入字符,直到看到换行符'\n' 或EOF。或者,通常更好的是,使用fgets 或类似的东西一次读取整行,然后解析输入。
【讨论】:
out,而不是in,它可以在输入输出流上调用(反正我记得. 我还记得从out 到in 操作的干预转换需要 fflush() 或 一个搜索操作。如果我记错了,请提前道歉,因为我很少发现自己在完整的 ii 模式下操作文件。
fflush()ing 一个仅输入的流很好,那么你不是唯一应该寻求教育的人。它可能在您的平台上“工作”,但不要指望它作为基于语言标准的规则“工作”。
fflush(stdin) 的行为。它由辅助 POSIX 标准定义;请参阅我的答案中的链接。但即使您想依赖 POSIX 定义,大多数使用 fflush(stdin) 的情况最好通过读取和丢弃字符来处理。