c++ - 有没有办法修复因未正确关闭 boost::archive::binary_oarchive 而损坏的文件?

标签 c++ boost binaryfiles

我运行了一个大型处理作业,生成了大量二进制文件作为输出。我想我现在意识到我的输出数据文件已损坏,因为在将数据文件移动到远程存储之前我没有正确刷新或关闭 boost::archive::binary_oarchive 对象。我想知道是否有任何方法可以通过附加一些特殊的 EOF 东西来修复输出数据文件,或者我是否运气不好,必须重新运行这项昂贵的工作?

更具体地说,我的处理作业像这样转储二进制数据:

   void dumpStuff() {
        // some code
        std::ofstream ofs(localFileName);
        boost::archive::binary_oarchive boa(ofs);
        boa << *data;   

        if (uploadToRemote) {
            // code that uploads files to remote store
            // does not run when I tested locally
        }
    }

我认为发生的情况是,当我在本地测试(并且没有上传到远程)时,boa 对象在 dumpStuff 函数结束时超出范围所以它的析构函数被调用,它正确地刷新流并关闭文件。然而,当上传到远程存储时,上传发生在 oba 的析构函数被调用之前,所以我认为流没有正确刷新,导致文件损坏。当我从商店获取损坏的文件并尝试使用 boost::archive::binary_iarchive 加载时,我得到了一个 InputStreamError

我知道我可以通过在 boa 东西周围添加一些大括号来强制它在上传到远程之前超出范围来解决这个问题,但是,这只会解决我的问题,如果我重新 -运行昂贵的大工作。所以,我的问题是,是否有一些简单的方法可以将某些内容附加到我损坏的文件的末尾以修复它们?某种 EOF 信号?

最佳答案

可能没有。然后,大部分肯定会取决于您使用的底层流的刷新行为。

这是一个只有你才有的一次性问题,所以你必须想办法解决。

  • 一种方法是查看源代码以找出由于缺少关闭而将跳过哪些操作。然后要么补偿丢失的输入,要么使输入存档实现更能容忍损坏/丢失的尾部。

  • 另一种方法是使用您自己的带有缺陷的代码来编写存档,然后编写相同的存档但错误已修复。

    看看十六进制编辑器中的区别。您可能很幸运,发现存档中丢失的数据已修复。如果是这样,只需将它附加到任何损坏的输入流并感到高兴。您更有可能拥有一些(简单的)可变数据,例如校验和或总大小。在这种情况下,要么尝试生成丢失的数据,要么破解输入流实现以检测所需的校验和。

CAVEAT: All of these suggest meddling with undocumented details, there will not be support, reliability depends solely on your own accuracy.

If you choose to "fake" checksums, be aware of the fact that it thwarts any builtin error-detection, so you might still read unreliable data (in case there was data corrupted in sotrage/transit)

关于c++ - 有没有办法修复因未正确关闭 boost::archive::binary_oarchive 而损坏的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44556935/

相关文章:

c++ - 如何使用cpp将类的成员写入二进制文件?

c++ - 运算符重载 [][] 二维数组 C++

c++ - 在 main 中返回 vector 可以吗

c++ - tensorflow:无效的 fastbin 条目(免费):0x00007f2fa8023940

c++ - 如何获取模板类型的内部类型?

c# - 在 C# 中使用 BinaryReader 读取 DAT 文件

c++ - 处理套接字断开连接。 boost/Winsock

c++ - 如何使用常规 makefile 构建依赖于 boost 的项目?

c++ - boost::multiprecision::cpp_dec_float_50 溢出检查

c++ - 在 C(或 C++)中循环遍历 WAV 文件