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
seekpauf 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 einstd::fstreamim Modusbinary|in|outgleichwertig 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
- Will man nach einer Schreiboperation lesen, so sollte man den Stream flushen (
-
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?