6

マップの内容 (キーは int の ID、値は自己定義の構造体) をファイルに書き込み、後でファイルからロードする必要があります。CArchive を使用して MFC で実行できますか?

ありがとうございました!

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;
    }
  }
}

アーカイブの読み取り中にエラーが発生した場合、ストリーミング操作の 1 つが例外をスローする必要があります。これは、上位レベルのフレームワークによってキャッチされます。

于 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 に答える