2013-05-21 4 views
6

Da entdeckte ich fflush(stdin) kein tragbarer Weg ist mit dem bekannten Problem der „Newline lauern im Eingangspuffer“ zu behandeln, ich habe folgende benutze, wenn ich zu Verwendung haben scanf:Kann fseek (stdin, 1, SEEK_SET) oder rewind (stdin) verwendet werden, um den Eingabepuffer anstelle von nicht-portablem fflush (stdin) zu löschen?

while((c = getchar()) != '\n' && c != EOF); 

Aber heute habe ich über diese Linie gestolpert, die ich bemerkt hatte, aus cplusplus.com on fflush: der Strom

fflush() ... in Dateien geöffnet für update (sowohl für das heißt offene Lese und Schriftfelter) wird nac gespült werden r eine Ausgabeoperation, bevor eine Eingabeoperation ausgeführt wird. Dies kann entweder dadurch erfolgen, dass Neupositionierung (fseek, fsetpos, Zurückspulen) oder durch den Aufruf explizit fflush

In der Tat habe ich gelesen, dass vor vielen times.So ich bestätigen will, wenn ich einfach jemanden der folgenden verwenden kann vor den scanf() den gleichen Zweck zu dienen, dass fflush(stdin) dient, wenn es unterstützt wird:

fseek(stdin,1,SEEK_SET); 
rewind(stdin); 

PSrewind(stdin) scheint ziemlich sicher und praktikabel die Puffer, bin ich falsch zu spülen?

Fehler Ich hätte fseek(stdin,0,SEEK_SET) erwähnt, wenn wir stdin reden als wir von ftell() zurück jeden Offset ungleich 0 oder einem in diesem Fall nicht verwendet werden können.

+0

Von Ihrem Zitat:“... * der Strom wird * nach einer Ausgabeoperation gespült werden .. . " Erwarten Sie, dass Sie Ausgabeoperationen auf 'stdin' ausführen, um' fflush (stdin) 'zu benötigen? Das scheint albern! Sie möchten * in einen * schreibgeschützten * Stream schreiben ?! Warum beschreibst du nicht, was du meinst, indem du * den Puffer spülst, oder was du mit 'fflush (stdin)' machen willst? Sie können auch darüber nachdenken, was 'fflush' tatsächlich gemäß [einem Nicht-C++ Handbuch] (http://pubs.opengroup.org/onlinepubs/009695399/functions/fflush.html) tut. Schließlich ist das C, nicht C++ ... – Sebivor

+0

@undefinedbehaviour Das ist nicht mein Zitat. Das ist von http://www.cplusplus.com/reference/cstdio/fflush/ genommen und das spricht über beide I/O-Streams, nicht "stdin" im Besonderen. Was ich meinte, ist, wenn wir von 'stdin' lesen, gemäß diesem Absatz, wären wir in der Lage, es zu spülen, indem wir' rewind() 'oder' fseek() 'darauf verwenden. – Jugni

+0

'stdin' ist nur zum Lesen geöffnet, nicht zum Aktualisieren (Lesen und Schreiben). Verwechsle diese beiden Modi nicht. Es ist nicht ungewöhnlich, dass diese Website grob ungenau ist. Suchen Sie eine andere manuelle Website. Ich empfehle opengroup. – Sebivor

Antwort

3

Dies ist das einzige tragbare Idiom zu verwenden:

while((c = getchar()) != '\n' && c != EOF); 

Mehrere Threads einschließlich this einem erklären, warum feesk nicht in der Regel arbeiten. für viel die gleichen Gründe, warum ich rewind funktionieren würden entweder zweifeln, in der Tat, sagt der Mann Seite ist es gleichbedeutend mit:

(void) fseek(stream, 0L, SEEK_SET) 
+0

Ich habe den Link gelesen, den Sie angegeben haben. Aber es scheint ein bisschen schwer zu verstehen. Können Sie den Teil des Links, der für diese Frage relevant ist, in ein paar einfachen Zeilen einfügen? – Jugni

+0

@Jugni Dieser Kommentar erklärt es wirklich http://stackoverflow.com/questions/4917801/using-fseek-with-a-file-pointer-that-points-to-stdin#comment5479013_4917849 im Grunde ist ein Stream nirgendwo gespeichert. Wenn Sie die Daten suchen möchten, lesen Sie sie in den Speicher. –

+0

Aber ich lese ein Stream ist standardmäßig gepuffert. Ich bin ziemlich sicher, 'stdin'und' stdout' sind gepuffert. Wie alle Streams geöffnet mit 'fopen()' – Jugni