Kleines Problem mit fstream



  • Ich teste gerade einige sachen mit den fstreams dabei bin ich auf ein sehr merkwürdiges Problem gestoßen.

    Hier erstmal mein Versuchsaufbau

    fstream file2;
    file2.open("app.txt",ios::out|ios::in|ios::binary);
    int i2=0;
    int i=12345;
    file2.read((char*)&i2,4);
    cout<<i2<<endl;
    file2.write((char*)&i,4);
    file2.close();
    

    bei app.txt handelt es sich um eine Datei ind er 2 int hintereinander stehen.

    Mein Problem ist nun folgendes, nehme ich obigen Versuchsaufbau solte ja die 1. Zahl eigentlich ausgelesen werden und die 2. durch den anderen int wert überschrieben werden, das passiert aber nciht, die datei bleibt unverändert, der schreibbefehl wird ignoriert. Wenn ich die Reihenfolge von read und write evrtausche wird das 1. int überschrieben, das 2. wird aber auch verändert. Was mache ich hier falsch?



  • Hallo

    Schau mal ob vor dem write-Aufruf eins der Error-Flags gesetzt ist (EOF, ...) weil wenn ja dann kann er keine Daten mehr schreiben.

    Mfg Marco



  • Xebov schrieb:

    ...

    Gelichzeitige IO über den selben Stream ist etwas komplizierter, als wenn man es über zwei Streams macht.
    Folgende Regeln helfen:

    • Will man nach einer Schreiboperation lesen, so sollte man den Stream flushen ( seekg() auf die gewünschte Position flusht implizit), damit der Puffer in einem sauberen Zustand ist.
    • Will man nach einer Leseoperation schreiben, so sollte man den Schreibzeiger mittels seekp auf die gewünschte Schreibposition setzen.

    Genauere Begründungen finden sich im C++ Standard und im C-Standard:
    ISO/IEC 14882:2003 27.8.1.3 § 2 sagt, dass ein std::fstream im Modus binary|in|out gleichwertig einem C-Stream ( fopen ) im Modus "r+b" ist.

    ISO/IEC 9899:1999 (leider nur C99, sollte aber gleich C89 sein) schrieb:

    When a file is opened with update mode ('+' as the second or third character in the
    above list of mode argument values), both input and output may be performed on the
    associated stream. However, output shall not be directly followed by input without an
    intervening call to the fflush function or to a file positioning function (fseek,
    fsetpos,or rewind), and input shall not be directly followed by output without an
    intervening call to a file positioning function, unless the input operation encounters end-
    of-file. Opening (or creating) a text file with update mode may instead open (or create) a
    binary stream in some implementations



  • Danke, habs passend Umgebaut und es funktioniert.

    Kleine Frage noch am Rande, lohtn es sich wenn man nur lesen oder schreiben will auf if und ifstream zurückzugreifen oder ist es auch ok generell nur fstream zu nehmen?


Anmelden zum Antworten