C++从文件的一部分加载数据

标签 c++ serialization file-io binaryfiles boost-serialization

我想在一个文件中保留一堆简单的结构(目前每个结构只有 3 个整数),并且能够在任何给定时间只读回其中一个结构。

作为第一步,我试图将它们输出到一个文件,然后使用 boost::serialization 读回它们。目前我正在这样做,它崩溃了:

std::array<Patch, 3> outPatches;

outPatches[0].ZOrigin = 0;
outPatches[0].XOrigin = 0;
outPatches[0].Resolution = 64;

outPatches[1].ZOrigin = 1;
outPatches[1].XOrigin = 5;
outPatches[1].Resolution = 3;

outPatches[2].ZOrigin = 123;
outPatches[2].XOrigin = 546;
outPatches[2].Resolution = 6;

std::ofstream ofs("testing.sss", std::ios::binary);

for (auto const& patch : outPatches)
{
    std::cout << "start archive: " << ofs.tellp() << std::endl;
    {
    boost::archive::binary_oarchive oa(ofs);
    std::cout << "start patch: " << ofs.tellp() << std::endl;

    oa << patch;
    }
}

ofs.close();


std::array<Patch, 3> inPatches;

std::ifstream ifs("testing.sss", std::ios::binary);

for (auto& patch : inPatches)
{
    std::cout << "start archive: " << ifs.tellg() << std::endl;
    {
    boost::archive::binary_iarchive ia(ifs); // <-- crash here on second patch

    std::cout << "start patch: " << ifs.tellg() << std::endl;

    ia >> patch;
    }
}

ifs.close();

for (int i = 0; i != 3; ++i)
    std::cout << "check: " << (inPatches[i] == outPatches[i]) << std::endl;

我计划使用 tell 为每个结构的位置创建索引,并在加载时寻求跳转到该结构。这是一个合理的方法吗?除了基础知识,我对流了解不多。

我试过将所有补丁放在一个 o/iarchive 中,这样可以很好地按顺序读取所有内容。但是,在流中搜索无效。

我找到了这个,这可能是我想要的,但我不知道它在做什么或如何使用它,或者它是否适用于 boost::serialization:read part of a file with iostreams

如有必要,我可能愿意切换到另一种序列化方法,因为我还没有深入了解这一点。

编辑 3:将编辑 1 和 2 移至答案。

最佳答案

我曾经有过类似的案例(使用 boost/serialization)。我当时所做的(如果我记得的话,它非常有效)是将文件映射到虚拟地址,编写一个在内存缓冲区而不是文件上运行的流媒体,并为我想读取的每个部分分配适当的偏移量streamer 作为缓冲区开始/长度并使用 streamer 初始化 iarchive,因此序列化库将其视为每个对象都在一个单独的文件中。

当然,添加到文件需要重新映射。现在回想起来,这似乎有点奇怪,但它是有效的,公平的。

关于C++从文件的一部分加载数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16003962/

相关文章:

java - 如何将编辑后的文本文件保存在 JTextArea 中?

c++ - C++中如何创建派生类

C++ 声明其大小值来自 const 数组的数组

c++ - 从 std::vector 获取最后一个元素

java - Parcelable 对象中的属性为 NULL 值。为什么?

c# - Web服务返回类型异常

c++ - 如何从 vector<char> 获取 char *?

android - 在Android中模拟 Activity 死亡

读取文件时的 Java 数据验证无法正常工作

java - 如何通过更改系统级Android路径来移动同一存储中的文件