005
10.10.2003, 11:49 Uhr
virtual
Sexiest Bit alive (Operator)
|
Mein Senf dazu:
Zitat: |
geissbock postete ok. ich glaub ich habe es. kann es sein das normalerweise nach einem fprintf die daten noch nicht in die datei gechrieben werden sondern erst nach dem programmende? mit dem fflush wird der buffer aber gleich in die datei geschrieben oder?
|
Jain. Die Dateihandles in C (also diese Dinger, die Dir fopen zurückliefert), können gepuffert sein. Da es sehr teuer wäre, jedesmal, wenn Du was schreibst, direkt auf Festplatte/Bildschirm zu schreiben (da sind je jede Menge Hardwarekomponenten und Betriebssystemebenen involviert), verfügt jedes Dateihandel über einen Puffer. ein printf etwa schreibt erst in diesen Puffer und wenn der voll ist, dann wird der Puffer automatisch gefluscht, also der Inhalt wird dahin geschrieben, wo er letztlich landen soll. Dies geschieht also nicht erst bei Programmende (da natürlich auch), sondern immer dann, wenn der Puffer voll ist, das Dateihandle geschlossen wird, oder aber fflush aufgerufen wird.
Man kann die Pufferung einstellen, dh den Puffer ganz ausstellen oder den Puffer vergrößern/verkleinern (übliche Werte für die Puffergröße liegen bei 4 oder 8 KB Speicher).
Zu beachten sind ein paar Feinheiten: 1. Entgegengesetzt landläufiger Meinung ist es nicht möglich, eine Eingabedatei, etwa stdin, zu flushen. Man findet oft den Hinweis auf die Frage "Wie kann ich verhindern, daß in stdin noch garbage steht, bevor ich mein scanf mache?" die falsche Antwort: "Mach ein fflush(stdin)". Das funktioniert nicht portabel und nur auf Rechnern, die vom Windowsvirus befallen sind (und da auch nur dann, wenn Windows funktioniert ).
2. Beim Programmstart ist stderr immer ungepuffert. Das aus gutem Grund: stderr dient dazu Fehlermeldung auszugeben. Und wenn man die puffern würde und es würde nicht geflusht bevor das Programm aufgrund eines Absturzes den Abgang macht, könnte man die Fehlermeldung niemals sehen.
3. Man kann mit setvbuf (oder dem weniger Flexiblen setbuf) Die Puffergröße ändern oder diese ausstellen. Es ist aber davon abzuraten, dies auf stderr oder stdout anzuwenden, solange man nicht genau weiiß, was man tut. Aber man sollte eigentlich immer wissen, was man tut -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) |