【问题标题】:Serialization using boost library [duplicate]使用boost库进行序列化[重复]
【发布时间】:2016-11-01 00:47:03
【问题描述】:

我正在尝试使用 boost 库来序列化 std::map 以便可以将其存储在文件中。但是我的行为很奇怪(我猜)。所以这是我的代码:

#include <map>
#include <fstream>
#include <iostream>
#include <bitset>

#include <boost/serialization/map.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>

std::map<int,int> map = {{65,2}, {69,1}, {75,1} ,{77,1}, {82,1}, {84,2}, {89,2}};

void saveMapToFile(std::ofstream& f);

int main()
{
    std::ofstream f("test.txt", std::ios::binary);

    saveMapToFile(f);

    std::cout << "position: " << f.tellp() << std::endl;
}

void saveMapToFile(std::ofstream& f)
{
    std::cout << "position : " << f.tellp() << std::endl;

    boost::archive::text_oarchive oarch(f);

    std::cout << "position : " << f.tellp() << std::endl;

    oarch << map;

    std::cout << "position : " << f.tellp() << std::endl;
}

这是上面代码的输出:

position : 0
position : 28
position : 75
position: 76

那么有人可以向我解释这里发生了什么吗?为什么在将地图(在函数中)插入到不同的外部之后定位?我没有做任何额外的操作,但是那个指针又多了一个字节......我错过了什么吗?提前感谢您的帮助。

【问题讨论】:

    标签: c++ serialization boost


    【解决方案1】:

    我不明白您为什么要对存档格式的实现做出假设。

    档案写标题,并且可以写“预告片”(想想 XML 档案)。

    oarch 的析构函数又写了一个字节,结束了流。它可以是哨兵、校验和、换行符等。

    【讨论】:

    • 是的,我明白这一点,但我不明白为什么它不一致。我的意思是我想将该地图之后的其他数据保存在一个文件中,但我对此有疑问。我应该在哪里执行存储?如果我将其他数据保存在该函数saveMapToFile() 中,它从第 75 个字节开始,如果我在外部执行它,则从第 76 个字节开始。然后在阅读时 - 在我阅读地图后,指针位置总是转到第 75 个字节,但其他数据可能从第 76 个字节开始,所以在那一刻我不确定我是否必须开始读取数据或移动到下一个字节和然后阅读。也许我不明白。
    • 您必须将存档而不是流传递给您的保存功能。
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    相关资源
    最近更新 更多