内存映射数据无法正确显示

时间:2019-02-20 16:43:42

标签: c++ 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();
} 

1 个答案:

答案 0 :(得分:1)

问题是您没有向archive1.bin写您认为正在写的东西。可以通过添加以下行来证明这一点:

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

在函数save的末尾,执行此操作时,您会看到:

  

22序列化::归档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