printfバッファリフレッシュの問題
4577 ワード
以下の内容はLinuxテストでWindowはPOSIXに従っていないので現象が異なります.
まずprintfバッファの問題は,sleep関数を用いた場合に発生したことを普段あまり発見していない.まず問題を見てみましょう.
上のコード正常出力:hello world 2つの間に1秒間隔で出力
次に修正します.
上のコード出力はhelloworldですが、出力は1秒遅れてからhelloworldを一緒に出力します.
エスケープ文字''を削除すると、遅延関数sleepは文間で遅延するのではなく、プログラム全体を遅延することになります.
printfは行バッファ関数で、バッファに書き込まれ、一定の条件を満たすと、バッファの内容が対応するファイルに出力されます.以下の条件でバッファをリフレッシュできます.
1バッファが満たされます.2に書き込まれた文字には、','r'があります.3 fflushを呼び出してバッファを手動でリフレッシュします.4 scanfを呼び出してバッファからデータを読み出すと、バッファ内のデータもリフレッシュされます.5 printf関数を呼び出すプロセスまたはスレッドが終了するとfflush関数が呼び出されます
次にプログラムを修正します
このときの効果はhelloを出力してから1秒後にworldを出力することです.
一、前言
まず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を出力することです.