什么情况ostream :: write或ostream :: operator<<会失败吗?

时间:2013-05-17 03:14:53

标签: c++ file ofstream ostream

在我的C ++代码中,我经常将不同的值写入文件。我的问题是,如果有任何情况写或或<<考虑到文件成功打开的事实,会失败。我是否需要检查每次写入或<<确保它正确执行?

3 个答案:

答案 0 :(得分:9)

列出所有内容的失败原因太多了。可能的是:

  • 分区终于满了
  • 用户超出了他的磁盘配额
  • 该分区已被残酷地卸下
  • 分区已损坏(文件系统错误)
  • 磁盘物理失败
  • ...
  

我是否需要检查每次写入或<<确保它正确执行?

如果您希望您的程序能够适应故障,那么肯定是。如果你不这样做,它只是意味着你写的数据可能会或可能不会写,这相当于说你不关心它。

注意:您可以根据自己的喜好设置std::ostream::exceptions,而不是在每次操作后检查流状态(很快就会非常繁琐),这样当流就会抛出异常失败(这不应该是一个问题,因为根据定义,这样的磁盘故障是非常特殊的。)

答案 1 :(得分:7)

写入失败的原因有很多。我的头顶是一些:

  1. 磁盘已满
  2. 磁盘失败
  3. 该文件位于NFS挂载上,网络出现故障
  4. 您正在写入的流(请记住,ostream并不总是文件)恰好是下游阅读器崩溃时关闭的管道
  5. 您正在写入的流是TCP套接字,而对等端消失
  6. 等等。

    编辑:我知道你已经说过你正在写一个文件,我只想提请你注意这样一个事实,即你的代码应该只关心它正在写一个可以的ostream代表任何一种流。

答案 2 :(得分:3)

其他人涵盖了可能导致输出失败的情况。

可是:

  

我是否需要检查每次写入或<<确保它正确执行?

对此,我会回答“不”。你可以想象一下

  • 如果文件成功打开,
  • 如果在您编写数据后流仍为good()

当然,这取决于所写数据的类型,以及从部分写入恢复到重新运行应用程序的可能性/相对复杂性。

如果您需要更准确地控制何时写入失败(例如,为了进行正常恢复),则链接到的ostream异常syam是可行的方法。每次操作后轮询流状态会使代码膨胀。