2017-10-30 3 views
2

This Frage stellt die Differenz zwischen app und ate und sowohl den Antworten und cppreference bedeutet, dass der einzige Unterschied besteht darin, dass app bedeutet, dass der Schreib Cursor am Ende der Datei vor jedem Schreibvorgang gesetzt wird , wobei ate bedeutet, dass der Schreibcursor nur beim Öffnen am Ende der Datei platziert wird.ofstream offen Modi: ate vs App

Was ich sehe tatsächlich (in VS 2012) ist, dass ateAngabe verwirft den Inhalt einer bestehenden Datei, während app nicht (es neue Inhalte auf den zuvor vorhandenen Inhalt anhängt). Mit anderen Worten, ate scheint trunc zu implizieren.

Die folgende Anweisung anfügt „Hallo“ an eine vorhandene Datei:

ofstream("trace.log", ios_base::out|ios_base::app) << "Hello\n"; 

Aber die folgende Anweisung ersetzt den Inhalt der Datei mit nur „Hallo“:

ofstream("trace.log", ios_base::out|ios_base::ate) << "Hello\n"; 

Die MSDN-Dokumentation VS 6.0 bedeutet, dass dies nicht passieren sollte (aber dieser Satz scheint in späteren Versionen von Visual Studio zurückgezogen worden zu sein):

ios :: trunc: Wenn die Datei bereits existiert, wird ihr Inhalt verworfen. Dieser Modus ist impliziert, wenn ios :: out angegeben ist und ios :: ate, ios :: app, und ios: in nicht angegeben sind.

Antwort

2

Sie müssen std::ios::in mit std::ios::ate dann versuchen, das Ende der Datei zu kombinieren, und fügen Sie den Text:

Betrachten ich eine Datei „data.txt“ haben, die diese Zeile enthält:

"Hello there how are you today? Ok fine thanx. you?" 

Jetzt öffne ich es:

1: std :: ios :: app:

std::ofstream out("data.txt", std::ios::app); 

out.seekp(10); // I want to move the write pointer to position 10 

out << "This line will be appended to the end of the file"; 

out.close(); 

Das Ergebnis ist nicht das, was ich wollte: Kein Verschieben des Schreibzeigers, sondern nur der Text wird immer an das Ende angehängt.

2: std :: ios :: ate:

std::ofstream out2("data.txt", std::ios::ate); 

out2 << "This line will be ate to the end of the file"; 

out2.close(); 

Das Ergebnis oben nicht das, was ich keinen Text angehängt wollte, aber der Inhalt abgeschnitten!

es kombinieren zu lösen ate mit in:

std::ofstream out2("data.txt", std::ios::ate | std::ios::in); 

out2 << "This line will be ate to the end of the file"; 

out2.close(); 

Jetzt ist der Text am Ende angehängt ist, aber was ist der Unterschied:

Wie gesagt App nicht den Schreibzeiger bewegt erlaubt aber gegessen tut.

Oben können wir den Schreibzeiger auf die Position, die wir wollen, während mit der App können wir nicht verschieben.

+1

Ja. Aber wie Sie sehen können, ist das Kombinieren von Leseflags 'std :: ios :: in' mit Schreibflags für einen Schreibstrom eine so dumme Logik in fstream. – Raindrop7