2013-04-23 14 views
9

Ich habe einen guten alten C FILE Dateideskriptor unter Windows, der von einem Ausgabestrom verwendet wird, um Daten zu schreiben. Meine Frage ist einfach und dennoch konnte ich die Antwort nicht finden:Wann wird FILE geleert?

Wann wird der Inhalt auf die Platte gespült, vorausgesetzt, ich rufe fflush nicht auf?

Der Stream empfängt ständig Daten und es scheint, dass der Inhalt ziemlich häufig geleert wird, aber was ist die Regel für das Löschen?

+3

Ziemlich sicher, dass es an dem Betriebssystem liegt. – Phonon

+0

Übrigens verwendet der Code einen wxTextOutputStream, der einen wxFFileOutoutStream verwendet, der eine wxFFile verwendet. Aber das kapselt nur eine FILE-Struktur, also denke ich, dass der fflush-Mechanismus das Interessante hier ist ... – anhoppe

+1

Wenn es gepuffert ist, dann wird es gelöscht, sobald der Puffer voll ist. Und ich verstehe nicht ganz, was Sie unter FILE-Struktur meinen , fwrite, ....) –

Antwort

13

Wenn die Bibliothek Umsetzung den Ausgangsstrom nicht bestimmen kann, zu einem interaktiven Gerät zu beziehen (und nur) Dann wird der Strom vollständig gepuffert werden, dh es wird ausgespült werden, wenn der Puffer (standardmäßig von BUFSIZ Größe) ist voll.

Wenn nicht vollständig gepuffert, kann ein Strom gepuffert werden Leitung, das heißt es gespült wird, wenn ein '\n' (oder der Puffer voll ist, wenn Ihre Linie wirklich lang ist) geschrieben wird, oder ungepufferte.

(ISO/IEC 9899: 1999, Kapitel 7.19.5.3 "Die fopen() Funktion" Absatz 7. Verwenden Sie keine neuere Version des Standard bei der Hand hat, aber AFAIK dies nicht ändern.)

Was ein "interaktives Gerät" ist, ist implementierungsdefiniert. (Kapitel 5.1.2.3 "Programmausführung", Abschnitt 6.)

Die allgemeine Idee ist, dass die Dateiausgabe vollständig gepuffert sein sollte, während die Ausgabe im Terminal gepuffert sein sollte (oder ungepuffert, wie Jesse Good richtig hervorhob).

Sowohl die Pufferrichtlinie als auch die Puffergröße können über setvbuf() geändert werden. Beachten Sie, dass jede solche Änderung passieren muss vor Sie beginnen den Zugriff auf den Stream, die etwas offensichtlich ist, sobald Sie darüber nachdenken.

+0

Mann, das ist eine gute Antwort, danke – anhoppe

+1

@anhoppe: Ich habe tatsächlich * implementiert * '', und * Junge * Sie besser lernen, das Kleingedruckte zu lesen, wenn Sie das tun ... :-D – DevSolar

+0

+1 Darüber hinaus gibt der [C11-Standard] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) an, dass "BUFSIZ" mindestens 256 sein sollte. –