6 Stimmen

Kann ich eine STL-Map in MFC mit CArchive serialisieren?

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!

7voto

Reunanen Punkte 7721

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.

1voto

Pieter Punkte 16973

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.com

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.

Powered by:

X