fflush
-
Hi,
In welchen Betriebssystemen funktioniert fflush() 100% ? Leert es den Tastaturpuffer auch 100% ? Wenn nicht wie kann ich sonst den Tastaturpuffer sonst 100% leeren?
gruß
-
Jeder ANSI C Compiler garantiert die 100% "richtige" Ausführung der Standardbibliothekfunktion fflush gemäß der Spezifikation.
Jeder ANSI C Compiler garantiert undefiniertes Verhalten bei Verwendung der Standardbibliothekfunktion fflush entgegen der Spezifikation.
Löschen kannst du den Tastaturpuffer z.B. indem du sicherstellst, dass '\n' noch enthalten ist und dann mittels Standardbibliotheksfunktionen bis einschließlich '\n' aus dem Tastaturpuffer liest.int i; scanf("%d",&i);while('\n'!=getchar());
-
Wutz schrieb:
Jeder ANSI C Compiler garantiert undefiniertes Verhalten bei Verwendung der Standardbibliothekfunktion fflush entgegen der Spezifikation.
Das ist Unfug. "Undefiniertes Verhalten" im Sinne des C-Standards bedeutet, dass der C-Standard das Verhalten nicht definiert. Eine Implementation kann aber durchaus ihr eigenes Verhalten definieren, wo es der C-Standard nicht tut, und MSVC tut für fflush auf Eignabeströmen genau das - wenn auch nicht in sonderlich hilfreicher Weise.
Gegen den Standard verstößt das erst dann, wenn die Implementation Verhalten definiert, das vom Standard in anderer Weise bereits definiert wurde.
Was den konkreten Fall angeht, ob stdin in irgendeiner Beziehung zu einer Tastatur steht, ist eine fragwürdige Annahme. Man kann da alles mögliche reinpipen - Dateien, die Ausgabe anderer Programme, der Vaterprozess kann eine eigene Pipe aufmachen und irgendwas da reinschreiben, und wenn das passiert, ist es eine selten dämliche Idee, den gesamten Eingabepuffer alle Nase lang wegzuwerfen.
Es gibt plattformabhängige Möglichkeiten, Konsolen auf vergleichbare Weisen zu malträtieren, womit wir der Sache zumindest näher kommen - im WinAPI gibt es FreeConsoleInputBuffer(HANDLE), unter UNIX etc. wird man sich im Zweifel mit ioctl herumschlagen müssen; das alles ist allerdings ein elendes Gefummel und eher selten nützlich. Du solltest dich wahrscheinlich fragen, was genau du eigentlich für ein Verhalten erreichen willst, und ich vermute stark, dass es auf zeilenweise Eingabe hinausläuft. In diesem Fall ist es sinnvoller, sich von diesen Low-Level-Mechanismen möglichst weit zu entfernen und einfach alle Zeichen bis zum nächsten Zeilenumbruch wegzuwerfen, beispielsweise wie Wutzs Code es tut.