c++ - ofstream::write 在写入大型二进制文件时在中间失败

标签 c++ ofstream

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

现在的问题是:每次写文件过程到63~64%时,写文件操作就失败了。第一次在文件A上失败,第二次在文件B上失败。

这几天程序运行的时候,正好我楼的电源在升级。奇怪的是,每次程序失败时,电工恰好在切断和恢复中央空调和一些办公室的电源。因此,我很怀疑写文件失败是否是电源不稳定造成的。

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

有什么办法可以查出具体原因吗?我觉得 ofstream 的标志(badbiteofbitfailbit)没有提供太多信息。现在我正在尝试使用 errnostrerror 来获取详细的错误消息。但是,我看到 errno 的可能值是 EIO,这意味着“I/O 错误”,它也没有提供任何有用的信息。

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

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

PS:这次程序失败55%,errno值为EINVAL: Invalid argument。很奇怪。

最佳答案

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

关于c++ - ofstream::write 在写入大型二进制文件时在中间失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314949/

相关文章:

c++ - auto const & map 迭代器的类型是什么? C++

c++ - double 值的不精确性是否保证在同一台机器上是一致的?

c++ - getline(file,line) 正在跳过行 - C++

c++ - 从 int 到 char* 没有字符串,和 fstream 不方便

c++ - 为什么vector前面没有push/pop?

c++ - 如何为动态分配的 STL 容器设置分配器?

c++ - Ofstream 比 cout 快? ||存储速度快于视觉输出

c++ - 正确选择文件流对象

c++ - 如何使 ostream 引用成为 ofstream? (C++)

c++ - 特殊订购的独特 STL 容器