4

在我的 C++ 代码中,我不断地将不同的值写入文件。我的问题是,考虑到文件已成功打开的事实,如果在任何情况下 write 或 << 会失败。我是否需要检查每个 write 或 << 调用以确保正确执行?

4

3 回答 3

9

失败的原因太多了,无法一一列举。可能的有:

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

我是否需要检查每个 write 或 << 调用以确保正确执行?

如果您希望您的程序对失败具有弹性,那么肯定的。如果你不这样做,它只是意味着你正在写入的数据可能会或可能不会被写入,这等于说你不关心它。

注意:您可以根据自己的喜好进行设置,而不是在每次操作后检查流状态(这很快就会非常乏味),std::ostream::exceptions以便流在失败时抛出异常(这应该不是问题,因为此类磁盘故障相当根据定义例外)。

于 2013-05-17T03:21:53.067 回答
7

写入失败的原因有很多。下面是我的一些想法:

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

等等。

编辑:我知道你说过你正在写入一个文件,我只是想提请注意你的代码应该只关心它正在写入一个可以代表任何类型流的 ostream。

于 2013-05-17T03:22:39.637 回答
3

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

但:

我是否需要检查每个 write 或 << 调用以确保正确执行?

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

  • 如果文件已成功打开,并且
  • good()如果在您写入数据之后流仍然存在。

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

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

于 2013-05-17T03:37:06.743 回答