4

重複の可能性:
改行が書式文字列に含まれていない限り、呼び出し後に printf がフラッシュされないのはなぜですか? (C)

私はこのようなコードを持っています:

printf("Starting nets allocation...");
while(...)
{
    ...some operations...
}
puts("DONE");

コードはすぐに文字列 "Starting nets allocation..." を出力し、ループの後に "DONE" を出力する必要があります。

代わりに、プログラムは最初にループを実行してから、"Starting nets allocation...DONE" という文字列を出力します。どうすればこれを解決できますか?

4

2 に答える 2

11

出力ストリームstdoutはデフォルトでバッファリングされるため、すぐに出力が必要な場合は、出力ストリームをフラッシュする必要があります - を使用するfflushか、次のように改行を出力しますprintf:

printf("Starting nets allocation...");
fflush(stdout);    

または:

printf("Starting nets allocation...\n");

setbufstdio.h の関数を使用して、ファイル ポインター レベルでバッファリングを制御することもできることに注意してください。

setbuf(stdout, NULL);

の 2 番目の引数setbufは、ストリームへの出力をバッファリングするために使用される、呼び出し元によって提供されるバッファです。NULL を渡すと、バッファリングが無効になることを示し、次と同等です。

setvbuf(stdout, NULL, _IONBF, 0);

これにより、指定されたストリームでのバッファリングも無効になります。

setbuf hereのドキュメントを参照してください。

于 2012-08-27T20:36:17.250 に答える
3

への出力stdoutはバッファリングされるため、追加します

fflush(stdout); 

printf内容をフラッシュするための呼び出しの後。通常、改行文字を追加するとバッファもフラッシュされますが、これは望ましくない場合があります。

于 2012-08-27T20:37:12.483 に答える