14.11 Pufferung
An dieser Stelle möchten wir Ihnen noch ein paar kurze Erklärungen zur Datenpufferung geben, da die Verwendung einer optimalen Puffergröße Ihre Dateizugriffe enorm beschleunigen kann (und eine nicht optimale Puffergröße verlangsamt natürlich den Ablauf). Die Standardeinstellung ist bei ANSI-C-Compilern die Vollpufferung. Das ist oft sinnvoller und schneller, als jedes einzelne Zeichen zu lesen oder zu schreiben, denn es finden ja immer nur blockweise Lese- und Schreiboperationen auf der Festplatte oder auf dem Arbeitsspeicher statt. Die Puffergröße ist natürlich auch abhängig vom Compiler, liegt aber meistens zwischen 512 und 4.096 Bytes. Die Puffergröße ist in der Header-Datei stdio.h in der Konstante BUFSIZ definiert.
Das bedeutet allerdings nicht, dass Sie von der Vollpufferung abhängig sind. Wenn Sie eine andere Pufferung für einen Stream verwenden möchten, können Sie dies mit den Funktionen setbuf() oder setvbuf() nach dem Öffnen eines Streams mittels fopen() ändern. Folgende Pufferungsarten können Sie verwenden:
-
Vollpufferung: Das ist die Standardeinstellung. Die Zeichen im Puffer werden erst übertragen, wenn der Puffer voll ist. Die Ausgabe von Daten, die noch im Puffer liegen, kann aber auch mit der Funktion fflush() erzwungen werden. Der Puffer wird nach dem normalen Schließen eines Streams und nach dem normalen Beenden eines Programms automatisch geleert.
-
Zeilenpufferung: Hier werden die Daten im Puffer erst übertragen, wenn ein Newline-Zeichen vorhanden oder wenn der Puffer voll ist.
-
Ungepuffert: Die Zeichen werden unmittelbar aus dem Stream übertragen.
fflush nur für Ausgabe-Streams
Die Funktion fflush() ist hilfreich für Ausgabe-Streams und sorgt dafür, dass alle noch im Puffer befindlichen und nicht geschriebenen Daten auf die Festplatte geschrieben werden. Nicht verwenden dürfen Sie die Funktion jedoch auf einen Eingabe-Stream, weil hier das weitere Verhalten laut Standard undefiniert ist. Ein fflush(stdin) mag zwar bei einigen Compilern funktionieren, um den Eingabepuffer der Tastatur zu »leeren«, aber es bleibt trotzdem dabei, dass die Verwendung dieser Funktion auf einen Eingabe-Stream per Standard nicht erlaubt ist.