【问题标题】:memory mapped data not comming correctly内存映射数据不正确
【发布时间】:2019-02-20 16:43:42
【问题描述】:

我已经编写了一个代码,我在二进制文件中写入一个映射,而不是使用 boost 内存映射读取它,但是每当我显示结果不正确时,它只显示值

1852795252

。我该怎么办?这是我的代码:

#include <iostream>
#include <vector>
#include <utility>
#include <fstream>
#include <utility>
#include <fstream>
#include <iterator>
#include <string>
#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <iostream>
#include <fstream>
#include <boost/serialization/map.hpp>

using namespace boost::archive;
using namespace boost::interprocess;
void save()
{
    {
        std::ofstream file{"archive1.bin"};
        text_oarchive oa{file};
        std::map<int,int> m;
        m[3] = 9;  
        oa << m;
    }
}

void load()
{
    file_mapping fm("archive1.bin", read_only);
    mapped_region region(fm, read_only);
    int * m = (int *)region.get_address();
    std::cout<<m[3]<<std::endl;
}

int main()
{
  save();
  load();
} 

【问题讨论】:

  • 当您尝试调试您的程序时,您的发现是什么?
  • 我找不到任何东西,它没有显示错误或警告消息。
  • 现在我对您在这里使用的库一无所知,但令我惊讶的是,您认为您可以将std::map 序列化为文件,然后将其读回,就好像它是一个数组一样。这对我来说似乎很可疑。

标签: c++ boost


【解决方案1】:

问题是你没有写信给archive1.bin 你认为你在写什么。这可以通过添加以下行来证明:

text_oarchive oa2 {std::cout};
oa2 << m;

在函数 save 的末尾,当你这样做时,你会看到:

22 序列化::archive 17 0 0 1 0 0 0 3 9

打印到stdout

为了进一步澄清,将函数load 的最后一行更改为:

std::cout << std::hex << m[3] << std::endl;

然后你会看到:

6e6f6974

这是ASCII noit,即archive1.bin中的第四个整数。

所有这些都是约翰在上面评论中所说的话的一种冗长的说法。您应该使用approved serialisation functions 阅读提升档案。

Live demo.

【讨论】:

  • 那么我如何通过内存映射正确写入和读取这个值?
  • @asdf 你的外部问题是什么?因为您尝试做的事情似乎并不明智,并且可能有一种明智的方法可以解决您遇到的任何问题。您正在尝试用一种方法写出数据,然后用一种完全不相关的方法将其读回,这种方法根本行不通。这就像让一位西班牙作家写一本书,然后让一位说法语的人尝试阅读它。为什么你会期望它对他们有意义? Boost 序列化和内存映射数组完全不相关。
  • 好吧,它用于 3d 计算机视觉项目,写入地图值是为了保存对象的模式,而读取它们是为了模式匹配,这发生在另一个程序中,但现在我正在测试函数所以...为此,我将使用键和值作为字符串。那我该怎么写呢?
猜你喜欢
  • 1970-01-01
  • 2012-07-04
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 2022-09-27
  • 2020-08-02
相关资源
最近更新 更多