Kann mir nochmal jemand "ofstream" erklären?



  • Hallo!

    Folgendes Problem. Ich erzeuge mit Hilfe von ofstream eine wav-Datei. Diese besteht aus Header und Daten, wobei im Header unter anderem die Dateilänge steht. Ich weiß allerdings erst zur Laufzeit, wie groß die Datei wird. Kein Problem, dachte ich, dann schreib ich in den Header halt erstmal Nullen, und aktualisier das später. Dazu folgende Funktion:

    void Headerupdate(long neue_laenge){
      std::ofstream dat; 
      dat.open(datei, std::ios::app|std::ios::binary);
      if (!dat) { 
         std::cout << "Fehler beim Öffnen der Datei!" <<std::endl;
         exit(2);
      }
      dat.seekp(4,std::ios::beg);
      int neu_mit_header=neue_laenge+36;
      dat.write(reinterpret_cast<char*>(&(neu_mit_header)),4);
      dat.seekp(40,std::ios::beg);
      dat.write(reinterpret_cast<char*>(&(neue_laenge)),4);
      dat.close();
     }
    

    Das Problem ist die Zeile

    dat.open(datei, std::ios::app|std::ios::binary);
    

    Arbeite ich mit "app", dann setzt er die beiden Längenangaben immer nach hinten, egal was seekp() sagt. Mit "out" löscht er die komplette Datei, das war mir eigentlich klar. Mit "ate" macht er komische Sachen, die ich nicht verstehe. Welchen Modus nutze ich also, wenn ich einzelne Daten in der Datei überschreiben will? 😕

    Edit: dat.good() liefert übrigens "true"



  • std::ios::out | std::ios::in
    

    out damit du schreiben kannst und in damit die datei so bleibt

    [tipp]
    schreib die datei doch erst dann auf die platte wenn du die größe kennst,
    den ob die datei eine länge 0 hat oder nicht existiert ist doch egal ?
    [/tipp]



  • Hey, das klingt ja fast logisch.
    Der Tipp ist gut gemeint, aber das Ungetüm wird ca. 60 MB groß, bevor ich die tatsächliche Größe weiß. Wird etwas schwierig, die Daten alle im Speicher zu halten 😉



  • Fledi schrieb:

    Hey, das klingt ja fast logisch.
    Der Tipp ist gut gemeint, aber das Ungetüm wird ca. 60 MB groß, bevor ich die tatsächliche Größe weiß. Wird etwas schwierig, die Daten alle im Speicher zu halten 😉

    Also 60MB sollten ohne Probleme in den Speicher passen... so viel ist das nun auch wieder nicht.


Anmelden zum Antworten