Spülen von Puffern in C

Lesezeit: 2 Minuten

Benutzeravatar von mrk
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?

  • 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


Mikes Benutzeravatar
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 stdindamit 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


1417350cookie-checkSpülen von Puffern in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy