STL Map in Datei schreiben und lesen



  • Hallo allerseits,
    Mein Problem ist folgendes:

    Ich möchte eine STL Map in eine Datei schreiben:

    std::map<int, std::string> mscore;
    
    std::ofstream score("Data/Score.zpd");
    
    mscore[100] = std::string("Jens"); // Hier wird die Map mit Daten gefüllt
    mscore[250] = std::string("Stefan");
    mscore[400] = std::string("Lena");
    mscore[750] = std::string("Daniel");
    mscore[1000] = std::string("Michael");
    mscore[1400] = std::string("Paul");
    mscore[2000] = std::string("Frank");
    mscore[5000] = std::string("Gaun");
    score.write((char*)&mscore, sizeof(mscore));
    score.close();
    

    Bis hierhin funktioniert auch alles. Zumindest hat die Datei einen Inhalt, wenn man mal mit dem Editor reinschaut.

    Später möchte ich mit einem anderen Programm die Datei öffnen:

    std::map<int, std::string> mscore;
    
    std::ifstream score("Data/Score.zpd");
    
    score.read((char*)&mscore, sizeof(mscore)); // Irgendwas stimmt hier vielleicht nicht
    score.close();
    

    Auf jeden Fall ist die Map nach der score.read Funktion mit 8 Error Einträgen gefüllt und ich verstehe nicht wieso. Die Header sind alle eingebunden und es gibt auch keine Compiler oder Runtime Fehler, die Map ist nur leider mit Fehlereinträgen gefüllt.

    Würde mich über schnelle Hilfe freuen 🙂

    mfg Zadro



  • Du musst über die Map iterieren und Eintrag für Eintrag selbst in die Datei schreiben. Am besten überlädst du hierzu den operator<<.



  • Grund:

    Die Map selbst enthält deine Daten gar nicht, sondern nur Verweise (Zeiger) auf diese Daten, welche irgendwo auf dem Heap liegen. Anders wäre es auch gar nicht möglich, da eine Struktur keine variable Größe haben kann. Du schreibst jedoch stur (und falsch) die Daten der Map in die Datei - darunter interne Informationen wie die Größe und die Zeiger.

    Etwas wie "write(t, sizeof(t))" ist bei Strukturen und Klassen sogut wie immer falsch.



  • Schau mal in die FAQ, da ist das erklärt.



  • Vielen Dank. Alles funktioniert 👍


Anmelden zum Antworten