printfバッファリフレッシュの問題


以下の内容はLinuxテストでWindowはPOSIXに従っていないので現象が異なります.

一、前言


まずprintfバッファの問題は,sleep関数を用いた場合に発生したことを普段あまり発見していない.まず問題を見てみましょう.
#include 

int main()
{
     
    printf("hello
"
); sleep(1); // 1 printf("world
"
); return 0; }

上のコード正常出力:hello world 2つの間に1秒間隔で出力
次に修正します.
#include 

int main()
{
     
    printf("hello"); /* '
'*/
sleep(1); printf("world
"
); return 0; }

上のコード出力はhelloworldですが、出力は1秒遅れてからhelloworldを一緒に出力します.
エスケープ文字''を削除すると、遅延関数sleepは文間で遅延するのではなく、プログラム全体を遅延することになります.

二、printfを深く理解する


printfは行バッファ関数で、バッファに書き込まれ、一定の条件を満たすと、バッファの内容が対応するファイルに出力されます.以下の条件でバッファをリフレッシュできます.
1バッファが満たされます.2に書き込まれた文字には、','r'があります.3 fflushを呼び出してバッファを手動でリフレッシュします.4 scanfを呼び出してバッファからデータを読み出すと、バッファ内のデータもリフレッシュされます.5 printf関数を呼び出すプロセスまたはスレッドが終了するとfflush関数が呼び出されます
次にプログラムを修正します
include <stdio.h>

int main()
{
     
    printf("hello");
    fflush(stdout);   // , 
    sleep(1);
    printf("world
"
); return 0; }

このときの効果はhelloを出力してから1秒後にworldを出力することです.