6

我需要将映射的内容(键是 int 的 ID,值是自定义结构的)写入文件,然后从文件中加载它。我可以在 MFC 中使用 CArchive 执行此操作吗?

谢谢!

4

2 回答 2

7

在 MFC 中,我相信最简单的方法是先序列化地图的大小,然后简单地遍历所有元素。

您没有指定是否使用std::map或 MFC 的CMap,但基于的版本std::map可能如下所示:

void MyClass::Serialize(CArchive& archive)
{
  CObject::Serialize(archive);
  if (archive.IsStoring()) {
    archive << m_map.size(); // save element count
    std::map<int, MapData>::const_iterator iter = m_map.begin(), 
                                           iterEnd = m_map.end();
    for (; iter != iterEnd; iter++) {
      archive << iter->first << iter->second;
    }
  }
  else {
    m_map.clear();
    size_t mapSize = 0;
    archive >> mapSize; // read element count
    for (size_t i = 0; i < mapSize; ++i) {
      int key;
      MapData value;
      archive >> key;
      archive >> value;
      m_map[key] = value;
    }
  }
}

如果在读取存档时发生错误,则其中一个流操作应引发异常,然后由更高级别的框架捕获。

于 2008-11-04T09:12:05.537 回答
1

我对 MFC 了解不多,但是使用Boost.Serialization可以轻松解决您的问题

struct MapData {
     int m_int;
     std::string m_str;

  private: 
    friend class boost::serialization::access; 

    template<class Archive> 
    void serialize(Archive &ar, const unsigned int version) 
    { 
        ar & m_int; 
        ar & m_str; 
    } 
};

std::map< int, MapData > theData;

template<class Archive>
void serialize(Archive & ar, std::map< int, MapData > & data, const unsigned int version)
{
    ar & data;
}

稍后您是否想要进行真正的归档:

std::ofstream ofs("filename"); 
boost::archive::binary_oarchive oa(ofs); 
oa << theData; 

而已。

(免责声明:只是在此框中键入的代码,根本没有经过测试,错字是故意的;)

于 2008-11-04T08:24:00.127 回答