2012-04-25 293 views
0

在运行时,我的程序会同时创建两个大的二进制文件并将其写入磁盘。文件A约为240GB,文件B约为480GB。这两个文件由两个ofstream对象维护,写入操作在循环中使用成员函数write执行。在编写大型二进制文件时,ofstream :: write在写入中途失败

现在的问题是:每次整个写文件过程达到63〜64%时写文件操作都会失败。第一次在文件A上失败,第二次在文件B上失败。

在程序运行期间,我的建筑物的电源正在升级。奇怪的是,每次程序失败时,电工恰好正在切断和恢复中央空调和一些办公室的电源。因此,我真的怀疑写入文件失败是否是由不稳定的电源造成的。

我确定失败不是由文件大小限制造成的,因为我试图用同样的方法编写一个单一的700GB文件而没有任何问题。

有没有办法找出详细的原因?我觉得ofstream的标志(badbit,eofbitfailbit)不提供太多的信息。现在我试图使用errnostrerror来获取详细的错误消息。然而,我看到errno的可能值是EIO,它测量了“I/O错误”,它再次没有提供有用的信息。

有没有人遇到过这种情况?

顺便说一句,当文件A和文件B的大小很小时,程序运行没有错误。

PS:这次程序在55%失败,并且errno值是EINVAL:无效参数。很奇怪。

+1

你有没有试过只写63〜64%的文件子集? – moooeeeep 2012-04-25 11:49:59

+0

@moooeeeep:但现在刚发生的是,它只是写出两个文件的63〜64%的子集。我可以看到63%〜64%的子集成功写入,因为我看到在程序转换时两个文件越来越大。 – 2012-04-25 11:58:27

+0

也许是S.M.A.R.T.实用程序可以给出一些线索。 – 2012-04-25 14:14:06

回答

0

好的,我已经解决了Win32 API的问题:CreateFile和WriteFile。