std::string binär in datei ausgeben



  • hallo zusammen,

    ich hab ein problem mit der binären ein und ausgabe
    erstmal das hier als grundgerüst:

    struct struktur
    {
        std::string name;
        struct innereStruktur
        {
            int i;
            // und mehr von diesen primitiven datentypen
        };
        struct innerereStruktur
        {
            float f;
            // und mehr von diesen primitiven datentypen
        };
    };
    

    so das ist meine struktur die ich in einer datei speichern will, und zwar so:

    // ausgabe
    struktur s; // mit initialisierung usw....
    std::ofstream fout("file.bin", std::ios::binary);
    fout.write(reinterpret_cast<char*>(&s), sizeof(s));
    fout.close();
    
    //eingabe
    std::ifstream fin("file.bin", std::ios::binary);
    fin.read(reinterpret_cast<char*>(&s), sizeof(s));
    fin.close();
    

    so, das klappt auch soweit auf den ersten blick ganz gut. aber wenn mein programm beendet kommt ein stack corruption error.
    ich tippe mal dadrauf, dass string itnern ja nur einen char pointer speichert sowie die grössen des string und so weiter. Und wenn man die daten jetzt neu einliest versucht er and er gleichen stelle zu schreiben, wie in dem vorigen programm, das diese datei speicherte - sprich komplett an der falschen stelle...

    kommt das vom denkansatz hin?
    und wie gebe ich einen std::string richtig binär aus?

    so in etwa?

    std::string s = "hallo binaere Welt!"
    std::ofstream out("text.bin", std::ios::binary);
    for(size_t i = 0; i < s.size(); i++)
        out.write(reinterpret_cast<char*>(&s[i]), sizeof(s[i]));
    

    mfg mosho



  • ja, oder so
    write(s.c_str(), sizeof(char)*s.size())



  • und die länge speichern



  • Skym0sh0 schrieb:

    so, das klappt auch soweit auf den ersten blick ganz gut. aber wenn mein programm beendet kommt ein stack corruption error.
    ich tippe mal dadrauf, dass string itnern ja nur einen char pointer speichert sowie die grössen des string und so weiter. Und wenn man die daten jetzt neu einliest versucht er and er gleichen stelle zu schreiben, wie in dem vorigen programm, das diese datei speicherte - sprich komplett an der falschen stelle...

    kommt das vom denkansatz hin?

    Ja, das kommt hin - ostream::write() schreibt nur die Inhalte im Objekt (beim String nur der Pointer und Größe/Kapazität). Daß du dort beim Rücklesen noch was gesehen hast, liegt vermutlich daran, daß du es aus dem selben Programm heraus gelesen hast und der Speicherbereich des ursprünglichen Strings noch nicht freigegeben bzw. überschrieben war.

    Als Lösung würde mir nur einfallen, den String manuell zu behandeln (entweder im Format Länge+Daten oder Daten+Trennzeichen).



  • naja, klar das könnte ich - also das trennen und so - aber ich wollte nur testweise damit mein programm läuft quick und dirty eine übergangslösung hinklatschen...


Anmelden zum Antworten