当编写大型二进制文件时,ofstream :: write在中间失败

时间:2012-04-25 11:47:23

标签: c++ ofstream

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

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

在这些天的程序运行期间,我的建筑的电源正好在升级之中。奇怪的是,每次节目失败时,电工正好切断并恢复中央空调和一些办公室的电源。因此,我真的很想知道写文件是否是由不稳定的电源引起的。

我确定故障不是由文件大小限制引起的,因为我尝试使用相同的方法编写单个700GB文件而没有任何问题。

有没有办法找出详细的原因?我觉得badbit的旗帜(eofbitfailbitofstream)没有提供太多信息。现在,我尝试使用errnostrerror来获取详细的错误消息。但是,我发现errno的可能值是EIO,它会测量" I / O错误",它再次没有提供有用的信息。

以前是否有人遇到过这种情况?

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

PS:这次程序失败率为55%,而errno值为EINVAL:参数无效。很奇怪。

2 个答案:

答案 0 :(得分:1)

确认,原因确实是NTFS的错误:A heavily fragmented file in an NTFS volume may not grow beyond a certain size。这意味着CreateFile和WriteFile也无法从根本上解决问题。

答案 1 :(得分:0)

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