Umlenkoperator soll sofort schreiben



  • Ich habe das Problem, dass ich in eine Datei schreiben möchte, aber die zu schreibenden Objekte am Ende des Zeigers gelöscht werden:

    boost::filesystem::ofstream datei(dateiname.str()); 
      boost::archive::xml_oarchive Archivdatei(datei);
    

    Nun schreibe ich in die Datei mit dem Umlenkoperator:

    ArchivDaten* AD = new ArchivDaten();
      Archivdatei << boost::serialization::make_nvp("ArchivDaten", AD);
    

    Eigentlich ist es mir recht, dass die Datei erst später am Ende des Programms wirklich auf die physische Platte geschrieben wird, aber sie sollte wenigstens im Speicher stehen. Momentan ist das leider nicht der Fall, da es sich bei AD um einen Zeiger handelt und das Objekt bald danach gelöscht wird. Jedenfalls ist die Ausgabe eindeutig, teilweise fehlen Daten!
    Warum wird denn das Objekt nicht sofort in diesen Ausgabestream gesteckt (auch wenn es später erst auf die Platte geschrieben wird)?



  • Probier mal ein datei << std::flush , nachdem Du mit dem Serialisieren fertig bist. Es könnte sein, dass der Stream gepuffert ist, und dann wird erst beim Flush bzw. beim Schließen in die Datei geschrieben.



  • fabske schrieb:

    Umlenkoperator:

    Woher hast du den Namen? Ausgedacht? Den Namen gibts nicht wirklich, und wenn, dann ist er höchst unüblich. Das Ding nennt sich shift-Operator, vielleicht auch noch (o)stream-Operator oder Ausgabe-Operator (auch nicht gerade üblich, aber man verstehts noch). Umlenkoperator klingt irgendwie blödsinnig...


  • Mod

    pumuckl schrieb:

    fabske schrieb:

    Umlenkoperator:

    Woher hast du den Namen? Ausgedacht? Den Namen gibts nicht wirklich, und wenn, dann ist er höchst unüblich. Das Ding nennt sich shift-Operator, vielleicht auch noch (o)stream-Operator oder Ausgabe-Operator (auch nicht gerade üblich, aber man verstehts noch). Umlenkoperator klingt irgendwie blödsinnig...

    Das klingt nach einem übereifrigen Übersetzer eines englischen Buches.



  • SeppJ schrieb:

    Das klingt nach einem übereifrigen Übersetzer eines englischen Buches.

    Wobei "to shift" mit "umlenken" zu übersetzen auch ziemlich daneben ist.



  • Zunächst mal scheint es eine Verwechlung mit dem < aus der shell zu sein, mit dem man die Standardeingabe auf eine Dateilesung "umlenken"(?) kann.



  • Ich denke ich habe es von der Shell 😃 Umlenkoperator habe ich da wohl mal gelernt..

    Also datei << std::flush ist keine Lösung! Das ist genau was ich nicht will, dass er sofort auf die Platte schreibt. Ich möchte dass es gepuffert wird, aber eben sofort gepuffert und nicht erst später.


  • Mod

    Funktioniert es denn mit flush? Ich bin gerade sehr überrascht, dass es ohne Fehler gibt. Ich kenne boost::serialization jetzt nicht so gut, aber das wäre doch ein sehr ungewöhnliches Design, daher vermute ich den Fehler anderswo.



  • Mit flush schreibt er schneller in die Datei, aber mein Problem ist dadurch nicht behoben. Ich dachte ich könnte folgenden Sachverhalt damit erschlagen:
    http://www.c-plusplus.net/forum/p2133668#2133668


Log in to reply