std::map Binär in Datei schreiben



  • Hallo zusammen,

    ich würde gerne eine std::map (binär) in eine Datei schreiben, so wie sie im Arbeitsspeicher steht, damit sie für weitere Programmdurchläufe aufgerufen werden kann.

    Das Problem ist, das es mit dem fstream nicht funktioniert (nach einem Tutorial aus dem Netz):

    map<KeyType,list<X> > database;
    
    /* database wird befüllt */
    
    fstream f1;
    f1.open("database.bin",ios::out|ios::binary);
    f1.write(&database,sizeof(database));
    f1.close();
    

    Ergibt einen Compiler-Fehler, da die Methode "write" wohl den ersten Parameter vom Typ "char[]" erwartet (fstream scheint also nur für das Speichern von Daten in form von Text zu funktionieren).

    Gibt es überhaupt eine Möglichkeit die map database irgendwie eins zu eins auf die Festplatte zu bekommen, um sie bei späteren Aufrufen dem Programm wieder zur verfügung zu stellen?

    danke schonmal.
    foxx



  • normalerweise castet man den ersten parameter von write nach char*

    f1.write(reinterpret_cast<char*>(&database), sizeof(database));
    

    aber ist keine gute idee stl container binär zu speichern, jedenfalls nicht so wie du meinst

    überleg mal was passiert wenn du eine klasse binär so speicherst die aber einen pointer inne hat der auf z.b. ein array zeigt...
    wird da das array mitgespeichert?



  • Hallo,

    erstmal danke für die schnelle Antwort.
    nein, es ist vermutlich keine gute Idee.
    Ich hatte gehofft, das es dafür vielleicht andere Standardmittel gibt.

    Ich hab jetzt nochmal recherchiert und es scheint in der boost eine lib zu geben, die das macht (Stichwort Serialization: http://www.boost.org/doc/libs/1_47_0/libs/serialization/doc/index.html).

    Ich hab jetzt das aus der Dokumentation nicht ganz verstanden, aber die scheint genau das zu machen, dass alles, was mit der zu speichernden Klasse/Container zusammenhängt auf die Platte schreibt (also werden auch evtl. Pointer dereferenziert und mit gespeichert).

    Ich hoffe, das daraus was wird 😃

    Edit:
    Achso ich kenne die Klassen, die in der Map verwendet werden (selbst geschrieben) und sie enthalten keine Pointer 😉

    Gruß
    foxx



  • aber die Map verwendet Pointer

    greetz KN4CK3R



  • Also kann man die std::map nicht mit Standardmitteln komplett auf die Platte schreiben?



  • doch, aber es gibt keine WriteMap Funktion. Sowas müsstest du dir selbst bauen.

    greetz KN4CK3R



  • und dmait bräuchtest du auch eine read funktion sonst kriegstes nichtmehr zurück, aber da du das selbst schreiben musst, sind dir alle freiheiten gegeben



  • Übrigens: Gibt es einen Grund warum du

    map<KeyType,list<X> >
    

    anstatt

    multimap<KeyType, X>
    

    verwendest?



  • Ich dachte bisher die std::map kann zu einem Key immer nur eine Value speichern. Da es aber vorkommen kann (und wahrscheinlich ist), das zu einem Key mehrere Values (Mehrere 😵 gespeichert werden, verwende ich hier eine std::list um auch Dopplungen zuzulassen.

    Edit: uups, überlesen, dass es "multimap" heißt... werde das mal in der Referenz nachschlagen, danke 😉



  • Deshalb eine multimap.


Log in to reply