Ich muss den Inhalt einer Map (Schlüssel ist eine ID von int, Wert ist eine selbst definierte Struktur) in eine Datei schreiben und sie später aus der Datei laden. Kann ich das in MFC mit CArchive machen?
Ich danke Ihnen!
Ich muss den Inhalt einer Map (Schlüssel ist eine ID von int, Wert ist eine selbst definierte Struktur) in eine Datei schreiben und sie später aus der Datei laden. Kann ich das in MFC mit CArchive machen?
Ich danke Ihnen!
In MFC ist es meiner Meinung nach am einfachsten, zuerst die Größe der Map zu serialisieren und dann einfach durch alle Elemente zu iterieren.
Sie haben nicht angegeben, ob Sie std::map
oder MFC's CMap
sondern eine Version, die auf std::map
könnte wie folgt aussehen:
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;
}
}
}
Wenn beim Lesen des Archivs ein Fehler auftritt, sollte eine der Streaming-Operationen eine Ausnahme auslösen, die dann vom Framework auf einer höheren Ebene abgefangen wird.
Ich weiß nicht viel über MFC, aber Ihr Problem ist ziemlich trivial gelöst mit Boost.Serialisierung
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;
}
Und dann später, wenn Sie die eigentliche Archivierung vornehmen wollen:
std::ofstream ofs("filename");
boost::archive::binary_oarchive oa(ofs);
oa << theData;
Das war's.
(Haftungsausschluss: Code einfach in dieses Feld eingegeben, nicht getestet, Tippfehler waren beabsichtigt ;)
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.