Beim Debuggen von jemand anderem Code stieß ich auf eine Interaktion zwischen C ++ "s fstream
Objekt, Eingabe über den Stream Operator und ios::app
was mir vorher nicht bewusst war.
Annehmen file.txt
existiert und enthält Textdaten. Das fstream
in seinem ursprünglichen Kontext war lange gelebt und diente sowohl für die Eingabe und Ausgabe. Der folgende Code funktioniert nicht wie erwartet (stellt keine Ausgabe aus der Datei bereit), Fehlerbehandlungscode wurde weggelassen:
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
fstream f("file.txt", ios::app);
string in;
f >> in;
cout << in << endl;
f.close();
return 0;
}
Durch das Ändern der Dateieröffnungsanweisung in den folgenden Schritten wird das Problem behoben:
fstream f("file.txt");
Ist das erwartetes Verhalten? Sollte es nicht möglich sein, ein fstream
Objekt mit ios :: app und erwarten, dass die Eingabe über die Stream-Operatoren korrekt funktioniert?
Kompiliert mit g ++ 4.6.3 unter 64-bit Linux und mingw-g ++ 4.4.1 unter 32-bit Windows 7
Antworten:
3 für die Antwort № 1Wenn Sie das überprüfen std::fstream
Konstrukteur Sie werden feststellen, dass das Standardargument ein Bitfeld der Flags ist ios_base::in
und ios_base::out
. Nur durch Lieferung ios_base::app
Als Flag machst du die Datei nur anhängen. wenn du willst beide eingeben und anhängen, dann müssen Sie z. ios::in | ios::app
.