2013-05-17 99 views

回答

9

有太多的失败原因列出他们全部。个可能的是:

  • 分区终于满
  • 用户超过了磁盘配额
  • 分区已经惨遭卸载
  • 分区已经损坏(文件系统错误)
  • 的磁盘物理
  • 失败...

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

如果你希望你的程序是有弹性的,以失败的话,肯定,。如果你不这样做,它只是意味着你写的数据可能写或不写,这就等于说你不关心它。

注:而不是每次操作后检查流状态(这将很快成为极其乏味的),你可以设置std::ostream::exceptions根据自己的喜好,这样,当它失败的流将抛出一个异常(这不应该是一个因为这种磁盘故障的定义非常特殊)。

+0

我想我会控制每一个写的调用。 – ipluto

+2

@ipluto:查看我的编辑以避免每一次“手动”查看。我认为在这种情况下,例外是**正确的工具。 – syam

+0

谢谢@syam。我马上检查一下。 – ipluto

7

写入失败有很多原因。关闭我的头顶,这里有几个:

  1. 磁盘已满
  2. 磁盘故障
  3. 该文件是在NFS挂载和网络中断
  4. 你流写入(请记住,一个ostream并不总是一个文件)恰好是当下游阅读器崩溃
  5. 你写到流封闭的管道是一个TCP套接字和同行消失

等。

编辑:我知道你说你写一个文件,我只是想提醒大家注意一个事实,即你的代码只应关心它是否写入其中可能代表任何形式的一个ostream流。

+1

+1的网络共享和管道/插座,我忘了... – syam

+0

感谢,特别是对提不相关文件的条件。 – ipluto

3

其他包括可能导致输出失败的情况。

但是:

我需要检查写或< <的每一个电话,以确保它是正确执行?

为了这个问题,我会回答 “不”。你可以想象一样好检查

  • 如果文件被成功打开,并
  • 如果流仍good()你写你的数据之后。

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

如果您需要在什么时候写失败了更严格的控制(例如,为了做一个优雅的恢复),该ostream的例外SYAM挂钩是要走的路。每次操作后轮询流状态都会使代码膨胀。

+0

+1,它的确可以使有道理的,如果数据不是太关键延迟退房(我猜被用来处理关键数据蒙蔽了我这种可能性松散检查的)。 – syam

+0

@syam:参见 - 在我正在使用的应用程序中,部分写入没有意义,并且不可能实现有意义的恢复。我的情况完全没有。我甚至不知道是否有可能立即将“ostream”打成一个例外,这对我来说是一个不错的胜利,如果我需要的话。 ;-) – DevSolar

+0

我最新的项目是完全相反的,我需要存储(几乎)实时输入数据,并尽量减少损失风险,就像我可以(因此我渴望检查每一个写)。无论如何,很高兴我的回答对你有用。 – syam

相关问题