Titelgrafik.

Erläuterungen zur Verwendung von flush()

Mit der Funktion flush() kann man den Schreibepuffer eines Dateideskriptors leeren, d.h. seinen Inhalt wirklich komplett in die Datei schreiben lassen. Doch wozu ist das gut?

Betrachten wir dazu den Fall, daß ein Programm nicht mehr genügend Zeit hat, um alle Teilaufgaben komplett zu lösen. Dann verbleibt gegebenenfalls eine schon berechnete Antwort auf eine Teilaufgabe im Puffer, während das Programm wegen Zeitüberschreitung terminiert wird. Dadurch ist die Antwort verloren.

Um das zu verhindern, sollte man nach der Ausgabe jedes Teilergebnisses explizit flush() aufrufen. — Allerdings sollte man das auch wieder nicht zu häufig tun, da das natürlich auch wertvolle Zeit kostet.

Die Praxis

Daher ergibt sich folgende Regel, falls es um solche zeitkritischen Teilaufgaben geht: Nach der Ausgabe jedes Teilergebnisses flush() aufrufen und Berechnungen so spät wie möglich durchführen, um davon eigentlich unabhängige Teilergebnisse nicht noch unnötig zu verzögern.

Beispiele

Die folgenden Programme schreiben jeweils bar in die Datei tim.out und gehen dann in eine Endlosschleife. Vorher flushen sie den Dateipuffer jedoch. Dies fuehrt dazu, dass, wenn die Programme später terminiert werden, der String "bar" auf jeden Fall in der Datei steht. (Obwohl er eigentlich zu kurz ist, um selber einen automatischen Flush auszulösen.)

buffer flush in C:

#include <cstdio>
int main() {
        FILE* f = fopen("tim.out", "w");
        fprintf(f, "bar\n");
        fflush(f);
        for (int i = 0; i < 2 ; i=1-i) ;
}

buffer flush in C++:

#include <fstream>

using namespace std;

int main() {
        ofstream tim("tim.out", ios::out);
        tim << "bar\n";
        tim.flush();
        for (int i = 0; i < 2 ; i=1-i) ;
}

buffer flush in Pascal:

program ti;
var tim:textfile;
    i:integer;
begin
  assign(tim, 'tim.out');
  rewrite(tim);
  writeln(tim, 'bar');
  flush(tim);
  i := 0;
  while (i < 3) do
    i := 1 - i;
end.