2012-10-17 4 views
12

Mögliche Duplizieren:
C++ Filehandling: Difference between ios:app and ios:ate?Unterschied zwischen ios :: app und ios :: ate

Was ist der Unterschied zwischen diesen beiden Modi Öffnen-Datei?

ios: atet setzt die get/put Zeigerposition an das Ende der Datei => lesen/schreiben wird am Ende beginnen, aber wie unterscheidet es sich von ios :: app, die wiederum eine Datei im Append Modus öffnet ... aber wenn ich einen ofstream erstellt habe und ihn im ios: app mode geöffnet habe, zeigt der put stream pointer immer noch auf den anfang, wie funktioniert das anhängende dann?

Auch ich verstehe, dass ifstream, ofstream und fstream Klassen auf hoher Ebene sind, um den zugrunde liegenden Stream-Puffer zu verwalten. Bedeutet das, dass ich auch im iOS: App-Modus Daten aus einer Datei lesen kann?

+1

Grundsätzlich sucht 'app' immer nach dem Ende, bevor etwas geschrieben wird, während' aß' Sie nach dem Öffnen suchen lässt und es dort hält. Siehe [diese Frage] (http://stackoverflow.com/questions/10359702/c-filehandling-difference-between-iosapp-and-iosate). – chris

Antwort

23

app kommt von "append" - alle Ausgaben werden am Ende der Datei hinzugefügt (angehängt). Mit anderen Worten, Sie können nirgendwo sonst in der Datei schreiben, aber am Ende

ate kommen Form 'am Ende' - es legt die Stream-Position am Ende der Datei, wenn Sie es öffnen, aber Sie können es frei bewegen (Suche) und schreibe wo immer es dir gefällt.

+0

Die Tatsache, dass "ate" die Kürzung nicht verhindert, macht es ziemlich nutzlos. Die Tatsache, dass "app" zu unbestimmten Zeiten teilweise Datensätze an das Ende anhängt (aufgrund der Pufferung) macht es ziemlich nutzlos. –

+0

@James: Wie ist 'app' /' ate' anders in dieser Hinsicht von den Schreibvorgängen bis zum Ende der Dateien, die * nicht mit diesen Flags geöffnet wurden? Ich dachte, es war nur als Zweck gedacht, um eine Suche zu retten. Ich wusste nicht, dass irgendjemand erwartet, dass es auch den Stream für sie spült, oder anderweitig die Dateiintegrität gewährleistet. –

+0

@SteveJessop 'app' maps zu' "a" 'in' fopen'. Der C-Standard erfordert keine Atomizität, da nicht alle Systeme ihn unterstützen können, aber der ursprüngliche Inhalt von "a" war, dass die Implementierung das Flag "O_APPEND" beim Öffnen der Datei verwendete. Was bewirkt, dass atomare Suche vor jedem Schreibvorgang endet. Der Unterschied ist sichtbar, wenn andere Prozesse in die Datei schreiben. Wenn ein anderer Prozess in die Datei schreibt, geht Ihre Position in der Datei nicht weiter und Ihr nächster Schreibvorgang überschreibt, was auch immer geschrieben wurde. Mit 'app' wird Ihr nächster Schreibvorgang unabhängig davon angehängt (und es gibt kein Rennen). –

8

Wenn Sie sich z.B. this reference, werden Sie sehen:

app  seek to the end of stream before each write 

und

ate  seek to the end of stream immediately after open 

Das bedeutet, dass ios::app erst am Ende schreibt, aber das ios::ate liest und schreibt am Ende in der Standardeinstellung. Mit ios::ate können Sie jedoch frei in der Datei suchen, aber mit ios::app werden Sie immer schreiben am Ende, egal welche Position Sie für den Schreibzeiger festlegen.

10

ate positioniert Sie einfach am Ende der Datei nach dem Öffnen, und sonst nichts. Es ist nicht viel auf eine ofstream, zumindest ohne andere Flags, da die Datei trotzdem abgeschnitten wurde, so dass der Anfang das Ende ist. (Um Kürzung zu vermeiden, und immer noch in der Lage sein, überall in der Datei zu schreiben, müssen Sie oder in ios::in auch, auch wenn Sie nicht lesen werden.)

verhindert die Kürzung einer vorhandenen Datei und bewirkt, dass jeder Schreibvorgang bis zum Ende der Datei geht. Atomisch, wenn möglich; Wenn andere Prozesse in dieselbe Datei schreiben, sollte Ihr Schreibvorgang immer noch bis zum Ende gehen. Beachten Sie jedoch, dass sich dies auf das tatsächliche Schreiben auf Systemebene bezieht. Wenn Sie jedoch Zeilen schreiben, die kleiner als die Puffergröße sind, und Sie jede Zeile mit std::endl terminieren, können Sie darauf zählen, dass jede Zeile atomar angehängt wird, unabhängig davon, was andere Prozesse mit der Datei machen. Um effektiv zu sein, sollten Sie wahrscheinlich auch pubsetbuf auf der filebuf verwenden, um eine minimale Puffergröße sicherzustellen.

In der Praxis glaube ich nicht, dass ich jemals eine von beiden verwendet habe, oder dass sie von Nutzen waren.Die Pufferprobleme mit app, insbesondere, haben im Allgemeinen dazu geführt, meine eigene streambuf mit konzeptionell unbegrenzter Pufferung (ein std::vector<char> als Puffer) zu schreiben, die die zugrunde liegende Systemdatei mit dem Äquivalent app öffnet, aber garantiert, nur wenn es explizit geschrieben wird flushed (wie bei `std :: endl).