Man sollte da unterscheiden zwischen dem Caching, das der Kernel eventuell vornimmt und der Pufferung durch den stdio-Layer. Außerdem sollte man sich gut überlegen welche Funktionen man benutzt, wenn man auf Portabilität Wert legt.
* Die ganze Familie der fopen, fclose, fread, fwrite, fprintf, ... Funktionen ist ANSI-C, wohingegen die open, close, read, write, ... Funktionen nur POSIX-Standard sind.
* Verwendet man die low-level POSIX-Funktionen, so hat man natürlich keine Pufferung, verwendet man die ANSI-C stdio-Funktionen, so hat man Pufferung.
* Ob die Pufferung standardmäßig für Dateien, die mit fopen geöffnet werden, oder für stdin und stdout aktiv ist, ist systemabhängig.
* Auf jeden Fall kann man aber mittels der ANSI-C Funktionen setbuf oder setvbuf die Pufferung durch den stdio-Layer pro FILE * explizit an oder ausschalten. Das sollte auch unter Windoof funktionieren.
* fflush verhindert nicht die Pufferung, leert aber die Puffer. Nach jedem Schreibvorgang ein fflush auszuführen, die Pufferung aber zu aktivieren ist also Perls $| = 1 am ähnlichsten.
* fcntl ist eine low-level Funktion, die mit Pufferung gar nichts zu tun hat und obendrein extrem unportabel ist. Bei einigen Betriebssystemen kann man allerdings über fcntl-Aufrufe das Caching auf Kernellevel für eine Datei deaktivieren oder eine Synchronisation des Dateisystemes erzwingen.
* select hat mit der ganzen Geschichte nun wirklich nichts zu tun. Das ist nur für I/O-Multiplexing gedacht und wird noch manchmal für präzises Timing verwendet.
When C++ is your hammer, every problem looks like your thumb.