【问题标题】:Why is fflush() not considered safe? [duplicate]为什么 fflush() 不被认为是安全的? [复制]
【发布时间】:2014-03-26 16:16:06
【问题描述】:

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

【问题讨论】:

标签: c file


【解决方案1】:

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

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

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

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

fflush 函数的流指向一个输入流或一个 更新输入最近操作的流

【讨论】:

  • 驾车投票者:我为你担心。现在就来发表评论吧,我们也许仍然可以为您提供帮助。
【解决方案2】:

你误会了。

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

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

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

【讨论】:

  • +1 只要最后一个操作是out,而不是in,它可以在输入输出流上调用(反正我记得. 我还记得从out 到in 操作的干预转换需要 fflush() 或 一个搜索操作。如果我记错了,请提前道歉,因为我很少发现自己在完整的 ii 模式下操作文件。
  • 但是我的大学教授告诉我这没关系,我很困惑,因为它也适用于输入流
  • @Bayant_singh 如果你的大学教授教你fflush()ing 一个仅输入的流很好,那么你不是唯一应该寻求教育的人。它可能在您的平台上“工作”,但不要指望它作为基于语言标准的规则“工作”。
  • @Bayant_singh:C 语言标准没有定义fflush(stdin) 的行为。它由辅助 POSIX 标准定义;请参阅我的答案中的链接。但即使您想依赖 POSIX 定义,大多数使用 fflush(stdin) 的情况最好通过读取和丢弃字符来处理。
  • 投反对票的人愿意发表评论吗?
猜你喜欢
  • 2011-08-13
  • 1970-01-01
  • 2014-04-04
  • 2019-02-07
  • 2011-08-25
  • 1970-01-01
  • 2021-02-04
  • 2014-03-08
  • 2012-11-19
相关资源
最近更新 更多