ein Kapitel zurück                                           ein Kapitel weiter

Diese Funktion haben wir ja schon relativ häufig Angewendet wenn es darum ging eine im Tastaturpuffer befindliches Zeichen '\n' (RETURN - Taste) zu entfernen. Dies haben wir mittels...

fflush(stdin);

...gemacht. Nun hierzu erst mal der Syntax von fflush...

int fflush(FILE *datei);

Mit fflush werden alle Inhalte von noch nicht geleerten Puffern einer Datei, der der FILE -Zeiger datei zugeordnet ist übertragen. Das heißt kurz und bündig, die der Datei datei zugeordneten Puffer werden geleert. Falls die Datei zum Schreiben geöffnet ist werden die noch im Puffer befindlichen Zeichen physikalisch in die Datei geschrieben. War eine Datei zum lesen geöffnet, werden die noch ungelesenen Zeichen im Eingabepuffer gelöscht. fflush gibt bei Erfolg 0 zurück andernfalls EOF. Anhand dieser Aussage werden sie schon merken das bei höheren E/A - Funktionen die Pufferung nicht Zeichen für Zeichen ist.

Ich glaube das erkläre ich Ihnen kurz. Die Standarteinstellung ist bei ANSI-C Compilern die Vollpufferung. Dies ist auch Sinnvoller und Schneller als keine Pufferung da weniger Lese- und Schreibeoperationen z.B. auf Festplatte oder Diskette stattfinden. Bei keiner Pufferung würde es 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)
u.s.w

Zeichen für Zeichen
Bei einer Datei von 100 Bytes wären das 100 Zugriffe zum Lesen von Tastatur in Abwechslung mit 100 Zugriffe zum Schreiben auf Diskette. Bei Vollpufferung läuft das viel besser ab. Es wird so lange gelesen bis der Puffer voll ist und dann wird geschrieben. In unserem Beispiel oben wären das bei Vollpufferung 1 mal lesen und 1 mal schreiben. Ist doch viel effektiver oder. Ich komme in einem späteren Kapitel noch zu den Verschiedenen Pufferungsarten zurück und werde Ihnen zeigen wie sie diese Einstellen können. Ich wollte hier das Thema nur kurz anschneiden um Ihnen den Sinn von fflush erklären zu können.

Nun scheint aber zwischen dem was ist und dem wie es sein sollte, nicht ganz klar zu sein, ob das auch für Linux gültig ist? Wie man dies auch aus der man-Page lesen kann. Auf Linux-Systemen will fflush partour nicht funkionieren. Beispielsweise folgendes Programm....

/*Download:fflush.c*/
#include <stdio.h> int main() { 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 0; }

Ich konnte das Programm verbiegen und verdrehen wie ich wollte. Immer wurde die 2.Ausgabe durch das '\n'-Zeichen überdrückt. Im Kapitel scanf habe ich Ihnen 4 Beispiele gezeigt, wie sie dieses Problem umgehen können.

Eine weitere Möglichkeit wäre die Funktion fpurge().......

int fpurge(FILE *stream);

...die genauso anzuwenden wäre wie fflush(). Nur scheint diese Funktion auf kaum einem System präsent zu sein. Folglich bleibt es dabei unter Linux, das Problem mit der Funktion fflush auf umständliche Weise zu lösen, wie sie es im Kapitel scanf nachlesen können.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf