Sollte fflush()
nicht verwendet werden, um einen Puffer zu löschen, auch wenn es sich um einen Ausgabestrom handelt?Puffer spülen in C
Wofür ist es nützlich? Wie spülen wir generell einen Puffer?
Sollte fflush()
nicht verwendet werden, um einen Puffer zu löschen, auch wenn es sich um einen Ausgabestrom handelt?Puffer spülen in C
Wofür ist es nützlich? Wie spülen wir generell einen Puffer?
Ich habe noch nie gehört, den Ausgabepuffer nicht zu leeren, und ich wäre daran interessiert, Ihre Quelle zu hören. Spülen der Ausgabepuffer:
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 sollten Sie einen Ausgabepuffer leeren wollen? Normalerweise passiert es, wenn der Code abstürzt und ich versuche etwas zu debuggen. Der Standardpuffer wird nicht jedes Mal gedruckt, wenn Sie printf()
aufrufen. Er wartet, bis er voll ist, und gibt dann einen Haufen auf einmal ab. Wenn Sie also vor einem Absturz prüfen wollen, ob Sie einen Funktionsaufruf machen, ist es hilfreich, printf
so etwas wie "Bekomme hier!" Zu verwenden, und manchmal wurde der Puffer nicht geleert, bevor der Absturz passiert und Sie können Sag nicht, wie weit du wirklich gekommen bist.
Eine andere Zeit, die es hilfreich ist, ist in Multi-Prozess oder Multi-Thread-Code. Auch bei einem Aufruf an einen printf()
wird der Puffer nicht immer gelöscht. Wenn Sie also die wahre Reihenfolge der Ausführung mehrerer Prozesse wissen möchten, sollten Sie den Puffer nach jedem Druck auflösen.
Ich mache eine Angewohnheit, es zu tun, es erspart mir eine Menge Kopfschmerzen beim Debuggen. Der einzige Nachteil, den ich mir vorstellen kann, ist, dass printf()
eine teure Operation ist (deshalb spült er standardmäßig nicht den Puffer).
Was den Eingangspuffer Spülung (stdin
), sollten Sie das nicht tun. stdin
Flushing ist undefiniertes Verhalten nach dem C11-Standard §7.21.5.2 Teil 2:
Wenn Strom zeigt auf einen Ausgangsstrom ... die Fflush Funktion keine ungeschriebenen Daten für diesen Strom verursacht ... geschrieben werden, die Datei; Andernfalls ist das Verhalten nicht definiert.
Auf einigen Systemen, Linux eines Wesen, wie Sie in der Manpage für fflush()
sehen können, gibt es ein definiertes Verhalten, aber es ist abhängig vom System so Ihr Code nicht tragbar sein wird.
Wenn Sie jetzt besorgt sind über Müll "stecken" in den Eingabepuffer können Sie fpurge()
darauf verwenden. Siehe here für mehr auf fflush()
und fpurge()
Danke! Wie wäre es mit Stdin (oder einem anderen Puffer)? – saadtaame
Siehe meine Bearbeitung (letzter Absatz), vielleicht wird das helfen. – Mike
Die Verwendung von 'fflush (stdin)' funktioniert definitiv in VS08/10. Ob es "gut definiert" ist oder nicht, weiß ich nicht. Es kann ein "Fix" in VS sein, weil ich ziemlich sicher bin, dass es unter Linux nicht funktionieren wird. – ChiefTwoPencils
einfach, dass Fflush beachten Sie nur gut definiert ist für Ausgabeströme, kann es nicht auf Eingabeströmen verwendet werden: das Verhalten undefiniert sein würde. – Lundin
@Lundin Ist es in Ordnung, es zu verwenden, um Ausgabeströme zu leeren? – saadtaame
@saadtaame Ja, genau dafür ist 'fflush()' gedacht. – Mysticial