首页 文章

C将std :: map序列化为文件

提问于
浏览
12

我有一个C STL映射,它是int和customType的映射 . customType是一个结构,它有字符串和字符串列表,如何将其序列化为文件 .

示例结构:

struct customType{
string;
string;
int;
list<string>;
}

5 回答

  • 1

    如果您不怕BOOST,请尝试BOOST Serialize :(模板代码,这里可能有些错误...)

    #include <boost/archive/binary_oarchive.hpp> 
    #include <boost/archive/binary_iarchive.hpp> 
    #include <boost/serialization/map.hpp> 
    #include <boost/serialization/string.hpp> 
    #include <boost/serialization/list.hpp> 
    
    struct customType{
     string string1;
     string string2;
     int i;
     list<string> list;
    
    // boost serialize 
    private: 
        friend class boost::serialization::access; 
        template <typename Archive> void serialize(Archive &ar, const unsigned int version) { 
            ar & string1; 
            ar & string2; 
            ar & i;
            ar & list;
        } 
    };
    
    template <typename ClassTo> 
    int Save(const string fname, const ClassTo &c) 
    { 
        ofstream f(fname.c_str(), ios::binary);
        if (f.fail()) return -1;
        boost::archive::binary_oarchive oa(f); 
        oa << c; 
        return 0;
    }
    

    用法:

    Save< map<int, customType> >("test.map", yourMap);
    
  • 1

    一个简单的解决方案是在一行上输出每个成员,包括列表中的所有字符串 . 每条记录都以 Map 的键开头,并以不在列表中的特殊字符或字符序列结束 . 通过这种方式,您可以一次读取一行,并知道第一行是 Map 键,第二行是结构中的第一个字符串,依此类推,当您到达特殊记录结束序列时,您知道列表已完成这是 Map 中下一个项目的时间 . 此方案使文件生成可读,如果您需要在程序外编辑它们,则可编辑 .

  • 0

    如果你问这个,那么你可能已经知道你不能通过以下方式序列化:

    file.write( (const char *) &mapOfCustom, sizeof( mapOfCustom ) );
    

    问题与复杂对象有关(在C中,即使是字符串变量也是一个复杂的对象),即那些不是自包含的对象 . 实际上,即使是简单的序列化也存在问题,其范围从平台兼容性到甚至编译器兼容性(不同的填充等) .

    一种方法是使用一个简单的XML库,如tinyXML:

    http://www.grinninglizard.com/tinyxml/

    并将保存写入XML,并从XML过程中恢复 .

  • 6

    C没有像Java和其他人那样的反射功能,因此没有“自动”方式 . 您必须自己完成所有工作:打开文件,在循环中输出每个元素,然后关闭文件 . 此外,文件没有标准格式,您需要定义一个满足您需求的格式 . 当然,有些图书馆可以提供帮助,但它们不是语言的一部分 . 看看这个问题:

    Is it possible to automatically serialize a C++ object?

    另请看一下:http://s11n.net/

  • 9

    你可以试试这个:cxx-prettyprint

相关问题