Containerklassen in Binärdatei schreiben



  • Hallo,

    ich möchte eine Struktur mit Vectoren und Strings in eine BINÄR- Datei schreiben. Da "ofstream.write(...)" nur die Pointer in die Datei schreibt suche ich nun einen Weg dieses zu umgehen. Hat jemand eine Idee???



  • Hallo,

    write schreibt was immer du angibst, nicht nur Pointer.
    Das hier schreibt eine string in eine Datei

    string test("Hallo");
    ofstream out("test.dat",ios::binary);
    out.write(test.c_str(), test.size());
    

    Bei string sollte man vorher auch die Länge mit abspeichern damit man sie wieder ordnungsgemäß einlesen kann.
    Bei Vektoren schreibt man die Inhalte raus (z.Bsp. über eine Schleife). Wie das nun geschieht, hängt davon ab, was in deinen Vektoren drin ist.

    Ciao



  • Hallo,

    bei einem einzelnen String mag das ja sein, nicht aber bei einer Struktur mit einem Element vom Typ string. In diesem Falle wird nur der Zeiger auf das String- Element der Struktur rausgeschrieben, d.H. nach Programmende sind die Daten weg.



  • Kurze Antwort: Dann schreibe nicht den Zeiger sondern dereferenzier ihn.

    Lange Antwort:
    Du brauchst ein Datenformat für mindestens die variablen Sachen (und strings sind nunmal variabel lang). Wenn Du alle Werte mit konstanter Länge direkt binär schreibst, und für Strings und andere Objekte variabler Länge eine Konvention (z.B. ein Byte länge, dann der variabel lange String) hast, musst Du die nur noch ins Programm gießen (was fertiges gibts dafür nicht).

    Also, sinngemäß

    out.write(&strukturFesterLaenge, sizeof(strukturFesterLaenge));
    
    int length = string1.size();
    out.write(&length, sizeof(int));
    out.write(string1.c_str(), length);
    
    /* ... */
    


  • Im Fall von structs würde ich denen einfach eine read und write Funktion spendieren, welche den stream übernimmt und die dann bei Bedarf aufrufen.

    struct test
    {
       int a;
       string h;
       ostream& write(ostream& out);
       istream& read(istream& in);
    };
    // dann noch implementieren
    ostream& write(ostream& out)
    {
       out.write(reinterpret_cast<const char*>(&a), sizeof(a));
       int s = h.size();
       out.write(reinterpret_cast<const char*>(&s), sizeof(s));
       out.write(h.c_str(), s);
    }
    // usw.
    


  • Auf gut deutsch heisst das, ich kann die Struktur nicht direkt rausschreiben??
    Ist ja ein Riesenstress, da ich einen ganzen haufen vectoren und strings habe, und ich bin sehr sehr Schreibfaul.
    Irgendeinen Weg muss es doch geben!!! 😡

    Bin für jeden Vorschlag dankbar.




Log in to reply