Nein, es ist kein POSIX-Verhalten, es ist ISO-Verhalten (nun, es ist POSIX-Verhalten, aber nur insoweit, als sie ISO-konform sind).
Die Standardausgabe ist zeilengepuffert, wenn erkannt werden kann, dass sie sich auf ein interaktives Gerät bezieht, andernfalls ist sie vollständig gepuffert. Es gibt also Situationen, in denen printf
nicht gespült wird, selbst wenn eine neue Zeile gesendet werden muss, z.
myprog >myfile.txt
Dies ist aus Effizienzgründen sinnvoll, da bei der Interaktion mit einem Benutzer wahrscheinlich jede Zeile angezeigt werden soll. Wenn Sie die Ausgabe an eine Datei senden, befindet sich höchstwahrscheinlich kein Benutzer am anderen Ende (obwohl dies nicht unmöglich ist, könnte er die Datei verfolgen). Jetzt Sie könnten argumentieren, dass der Benutzer jeden Charakter sehen möchte, aber es gibt zwei Probleme damit.
Das erste ist, dass es nicht sehr effizient ist. Das zweite ist, dass das ursprüngliche ANSI C-Mandat darin bestand, in erster Linie vorhandenes Verhalten zu kodifizieren , anstatt neues Verhalten zu erfinden , und diese Entwurfsentscheidungen wurden lange vor Beginn des Prozesses durch ANSI getroffen. Selbst ISO geht heutzutage sehr vorsichtig vor, wenn bestehende Regeln in den Standards geändert werden.
Wie Sie damit umgehen sollen, wenn Sie fflush (stdout)
nach jedem Ausgabeaufruf, den Sie sofort sehen möchten, , wird das Problem gelöst.
Alternativ können Sie verwenden , setvbuf
vor dem Betrieb auf stdout
, um es zu ungepufferten zu setzen und Sie werden nicht über das Hinzufügen all diese Sorgen haben fflush
Linien , um Ihren Code:
setvbuf (stdout, NULL, _IONBF, BUFSIZ);
Denken Sie daran , dass ziemlich viel Einfluss auf die Leistung, wenn Sie sind die Ausgabe in eine Datei zu senden. Beachten Sie auch, dass die Unterstützung dafür implementierungsdefiniert ist und nicht durch den Standard garantiert wird.
Der Abschnitt ISO C99 7.19.3/3
ist das relevante Bit:
Wenn ein Stream ungepuffert ist , sollen Zeichen so schnell wie möglich von der Quelle oder vom Ziel angezeigt werden. Andernfalls können Zeichen akkumuliert und als Block zur oder von der Hostumgebung übertragen werden.
Wenn ein Stream vollständig gepuffert ist , sollen Zeichen als Block zur oder von der Host-Umgebung übertragen werden, wenn ein Puffer gefüllt ist.
Wenn ein Stream zeilengepuffert ist , sollen Zeichen als Block zur oder von der Host-Umgebung übertragen werden, wenn ein neues Zeilenzeichen auftritt.
Darüber hinaus sollen Zeichen als Block an die Hostumgebung übertragen werden, wenn ein Puffer gefüllt ist, wenn eine Eingabe in einem ungepufferten Stream angefordert wird oder wenn eine Eingabe in einem zeilengepufferten Stream angefordert wird, der die Übertragung von Zeichen aus der Hostumgebung erfordert .
Die Unterstützung für diese Merkmale ist implementierungsdefiniert und kann über die Funktionen setbuf
und beeinflusst setvbuf
werden.