/ / Interaktion zwischen ios :: app und einem für die Eingabe verwendeten fstream - c ++, io, append, iostream, fstream

Interaktion zwischen ios :: app und einem für die Eingabe verwendeten fstream - c ++, io, append, iostream, fstream

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 № 1

Wenn 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.