Sollte fflush()
nicht zum Leeren eines Puffers verwendet werden, selbst wenn es sich um einen Ausgabestrom handelt?
Wofür ist es nützlich? Wie leeren wir einen Puffer im Allgemeinen?
mrk
Sollte fflush()
nicht zum Leeren eines Puffers verwendet werden, selbst wenn es sich um einen Ausgabestrom handelt?
Wofür ist es nützlich? Wie leeren wir einen Puffer im Allgemeinen?
Mike
Leeren der Ausgangspuffer:
printf("Buffered, will be flushed");
fflush(stdout); // Prints to screen or whatever your standard out is
oder
fprintf(fd, "Buffered, will be flushed");
fflush(fd); //Prints to a file
Kann eine sehr hilfreiche Technik sein. Warum möchten Sie einen Ausgabepuffer leeren? Wenn ich das mache, liegt es normalerweise daran, dass der Code abstürzt und ich versuche, etwas zu debuggen. Der Standardpuffer wird nicht bei jedem Aufruf gedruckt printf()
Es wartet, bis es voll ist, und entleert dann einen Haufen auf einmal. Wenn Sie also versuchen zu überprüfen, ob Sie es vor einem Absturz zu einem Funktionsaufruf schaffen, ist dies hilfreich printf
etwas wie “hier angekommen!”, und manchmal wurde der Puffer nicht geleert, bevor der Absturz passiert, und Sie können nicht sagen, wie weit Sie wirklich gekommen sind.
Ein weiterer hilfreicher Fall ist Multi-Process- oder Multi-Thread-Code. Auch hier wird der Puffer bei einem Aufruf von a nicht immer geleert printf()
Wenn Sie also die wahre Reihenfolge der Ausführung mehrerer Prozesse wissen möchten, sollten Sie den Puffer nach jedem Druckvorgang leeren.
Ich mache es mir zur Gewohnheit, es erspart mir eine Menge Kopfschmerzen beim Debuggen. Der einzige Nachteil, den ich mir vorstellen kann, ist das printf()
ist eine teure Operation (weshalb der Puffer standardmäßig nicht geleert wird).
Was das Leeren des Eingabepuffers angeht (stdin
), das solltest du nicht tun. Spülung stdin
ist undefiniertes Verhalten gemäß C11-Standard §7.21.5.2 Teil 2:
Wenn stream auf einen Ausgabestream zeigt … bewirkt die fflush-Funktion, dass alle ungeschriebenen Daten für diesen Stream … in die Datei geschrieben werden; andernfalls ist das Verhalten undefiniert.
Auf einigen Systemen ist Linux eines, wie Sie in der Manpage für sehen können fflush()
gibt es ein definiertes Verhalten, aber es ist systemabhängig, sodass Ihr Code nicht portierbar ist.
Wenn Sie sich jetzt Sorgen um Müll machen, der im Eingabepuffer “steckengeblieben” ist, können Sie verwenden fpurge()
auf diesem. Sehen hier für mehr auf fflush()
und fpurge()
fflush(stdout)
wird keine Auswirkung auf haben stdin
damit Sie keine Eingaben verlieren. fpurge
wird meines Wissens nach in keiner Norm erwähnt.
– Chris Dodd
17. September 2012 um 2:21 Uhr
Wenn ich versuche, ein Programm zu debuggen und zu sehen, ob es zu einer bestimmten Anweisung kommt, tue ich es einfach fprintf(stderr, "got here!\n");
. Seit stderr
nicht gepuffert, wird sofort gedruckt.
– ianmartorell
12. August 2015 um 21:02 Uhr
Beachten Sie nur, dass fflush nur für Ausgabestreams gut definiert ist, es kann nicht für Eingabestreams verwendet werden: Das wäre ein undefiniertes Verhalten.
– Ludin
16. September 2012 um 19:38 Uhr
@saadtaame Ja, genau das ist es
fflush()
ist für.– Mystisch
16. September 2012 um 19:42 Uhr
@BrunoKim: Siehe en.cppreference.com/w/cpp/io/c/fflush und stackoverflow.com/search?q=fflush+stdin
– Greg Hewgill
16. September 2012 um 21:12 Uhr