我运行了一个大量的处理工作,产生了大量的二进制文件作为输出。我想我现在意识到我的输出数据文件被损坏了,因为在将数据文件移动到远程存储器之前,我没有正确地刷新或关闭对象boost::archive::binary_oarchive
。我想知道是否有任何方法通过在输出数据文件中添加一些特殊的EOF事件来修复输出数据文件,或者我运气不好,而且我必须重新运行昂贵的工作?有什么办法可以修复由于没有正确关闭boost :: archive :: binary_oarchive而损坏的文件吗?
更具体地说,我的处理作业转储二进制数据,像这样:
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信号?
我可能会为了重新运行大型工作而权衡任何开发费用。在大多数情况下,重新运行它最终会更便宜。而且无论如何更具可预测性。自从在SO上发布此问题后,您已经失去了8个小时(假设您没有开始重新运行) – sehe
这是一个远射。您可以修改反序列化例程的顶层(通常称为“load”)来检测不一致的值(例如非常大的整数)并停止反序列化。您最终将得到一些无效状态的值,但可能有99%的信息要恢复。 – alfC
“有没有办法修复由于没有正确关闭”No.“而损坏的文件... boost :: archive :: binary_oarchive?”无关紧要。 – EJP