18.13 (Tastatur-)Puffer leeren – fflush
 
Diese Funktion dürfte Ihnen aus Kapitel 5, Formatierte Eingabe mit scanf(), bekannt vorkommen, als es darum ging, ein im Tastaturpuffer befindliches Zeichen wie '\n' (Newline-Zeichen) zu entfernen. Die Syntax von fflush():
#include <stdio.h>
int fflush(FILE *datei);
Mit fflush() werden alle Inhalte von einem noch nicht geleerten Puffer eines Streams übertragen, die dem FILE-Zeiger datei zugeordnet sind (oder auch Standard-Streams). Das heißt kurz und bündig, die dem Stream zugeordneten Puffer werden geleert. Falls die Datei zum Schreiben geöffnet ist, werden die sich noch im Puffer befindlichen Zeichen physikalisch in die Datei geschrieben. War eine Datei zum Lesen geöffnet, werden die noch nicht gelesenen Zeichen im Eingabepuffer gelöscht. fflush() gibt bei Erfolg 0 zurück, andernfalls EOF.
Es scheint aber nicht ganz klar, ob dies auch für Linux gültig ist – wie Sie dies auch auf der man-Page zu fflush() nachlesen können. Auf Linux-Systemen will fflush() partout nicht funktionieren. Nehmen Sie etwa folgendes Programm:
/* fflush.c */
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char x,y;
printf("Bitte einen Buchstaben eingeben : ");
scanf("%c",&x);
fflush(stdin);
printf("Bitte noch einen Buchstaben eingeben : ");
scanf("%c",&y);
printf("Sie gaben ein %c und %c \n",x,y);
return EXIT_SUCCESS;
}
Sie können das Programm verbiegen und verdrehen wie Sie wollen, immer wird die zweite Ausgabe durch das sich im Puffer befindliche '\n'-Zeichen überdrückt. In Kapitel 5 finden Sie Beispiele, wie das Problem gelöst werden kann.
Der ANSI C-Standard schreibt aber auch nicht vor, wie die Funktion fflush() auf den Stream stdin zu reagieren hat. Das Verhalten ist somit nicht definiert und kann funktionieren oder auch nicht.
18.13.1 Pufferung
 
Eine kurze Erklärung zur Pufferung: Die Standardeinstellung ist bei ANSI C Compilern die Vollpufferung. Dies ist auch sinnvoller und schneller als keine Pufferung, da wenige Lese- und Schreiboperationen etwa auf der Festplatte, der Diskette oder dem Arbeitsspeicher stattfinden. Die Puffergröße ist abhängig vom Compiler, liegt aber meistens bei 512 und 4096 Bytes. Die Größe ist in der Headerdatei <stdio.h> mit der Konstante BUFSIZ angegeben.
Bei einer Pufferung, die zeichenweise eingestellt ist, würde ein Kopiervorgang zum Beispiel so ablaufen:
Lese aus Datei ein Zeichen (von z.B. Tastatur)
Schreibe in eine Datei ein Zeichen (z.B. Diskette)
Lese aus Datei ein Zeichen (von z.B. Tastatur)
Schreibe in eine Datei ein Zeichen (z.B. Diskette)
Lese aus Datei ein Zeichen (von z.B. Tastatur)
Schreibe in eine Datei ein Zeichen (z.B. Diskette)
usw. Zeichen für Zeichen
Bei einer Datei mit 100 Bytes wären das 100 Zugriffe zum Lesen von der Tastatur im Wechsel mit 100 Zugriffen zum Schreiben auf die Diskette.
Bei Vollpufferung läuft dies so: Es wird so lange gelesen, bis der Puffer voll ist (BUFSIZE), und dann wird geschrieben. Im obigen Beispiel würde bei Vollpufferung einmal gelesen und einmal geschrieben.
|