Guten Morgen Liste,
vielleicht ist ja der ein oder andere Leser unter
Euch der ebenso wie ich feststellen musste, dass
die Funktion fflush unter Linux nur bedingt seine
Dienste verrrichtet.
Was ich bisher darueber weis:
- K&R, zweite Ausgabe "..bei einem Eingabestrom
ist der Effekt undefiniert(...)
- man kann sich mit Makros oder Funktionen helfen..zB
#define FLUSH( int_keyboard_buffer ) while(( int_keyboard_buffer =
getchar()) != '\n')
- das es auf den Systemen einen Unterschied zwischen binaer
und Textdaten gibt
was ich nicht weis:
- wieso funktionierts auf DOS-Boxen trotz der K&R Aussage
- wie eine saubere Implenmentierung in einer Linux-Umgebung
aussehen koennte
Ich habe mich auf meiner SuSE 8.2 umgebung umgesehen und
eine (nicht portable ?) loesung gefunden. Hier der Code
mit einem Beispielaufruf:
#include
int lfflush(FILE *stream);
int main()
{
char x,y;
printf("Bitte einen Buchstaben eingeben : ");
scanf("%c",&x);
/* Beispiel lfflush mit Fehlerüberprüfung */
if (lfflush(stdin) != 0)
printf("Fehler bei Flush");
printf("Bitte noch einen Buchstaben eingeben : ");
scanf("%c",&y);
/* Aufruf von lfflush ohne Fehlerüberprüfung - fflush wie gehabt */
lfflush(stdin);
printf("Sie gaben ein %c und %c \n",x,y);
return 0;
}
/* lfflush(FILE *stream): leert den Eingabepuffer von *stream */
/* gibt zurück: Bei Erfolg 0, sonst -1 */
/* Die Definition der FILE-Struktur hab ich in libio.h gefunden */
/* welche in stdio.h eingebunden wird */
/* Getestet mit SuSE 8.2 */
int lfflush(FILE *stream)
{
/* Kopie des Filezeigers machen */
FILE *read=stream;
/* ... diese Elemente der FILEstruktur sind interessant... */
/* Den Zeiger _IO_read_ptr so lange nach hinten schieben, */
/* bis er identisch mit dem Endepufferzeiger _IO_read_end ist. */
/* Fuer jeden Verschiebevorgang das Zeichen mit getc */
/* aus dem Orig.stream *stream entfernen. */
while( read->_IO_read_ptr != read->_IO_read_end )
getc(stream);
if (read->_IO_read_ptr != read->_IO_read_end)
return -1; /* Fehler */
else
return 0; /* passt, puffer ist leer */
}
Im Netz habe ich auf diese Frage auch keine Antwort gefunden.
Weis jemand eine schluessige Erklaerung wieso fflush auf DOS
funktioniert und nicht auf Linuxsystemen und vielleicht einen
allgemeineren Ansatz gefunden als den o.a. ?
OkiDoki
Oli