マップの内容 (キーは int の ID、値は自己定義の構造体) をファイルに書き込み、後でファイルからロードする必要があります。CArchive を使用して MFC で実行できますか?
ありがとうございました!
マップの内容 (キーは int の ID、値は自己定義の構造体) をファイルに書き込み、後でファイルからロードする必要があります。CArchive を使用して MFC で実行できますか?
ありがとうございました!
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 つが例外をスローする必要があります。これは、上位レベルのフレームワークによってキャッチされます。
私は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;
それでおしまい。
(免責事項: コードはこのボックスに入力しただけで、まったくテストされていません。タイプミスは意図されたものです ;)