2013-02-04 9 views
5

sleep()関数を使用しているときにputs()関数とprintfここでsleep()を使用しているときのCのputs()とprintf()の違い

は(C言語では)私のコードです:

printf("hello, world"); 
sleep(1); 
printf("Good, bye!"); 

プログラムをコンパイルして実行した後、最初寝してから印刷しますようです「こんにちは、worldGood、さようなら!」

しかし、printf()の代わりにputs()を使用すると、 "hello、world"が表示されてスリープし、最後に "Good、bye"が表示されます。

puts("hello, world"); 
sleep(1); 
puts("Good, bye!); 

答えて

7

これはバッファリングが原因です(デフォルトでは、新しい行ごとに標準出力バッファが使用されます)。 printf()に改行が含まれていないため、出力はフラッシュされません。 puts()に改行が含まれるため、出力はフラッシュされます。

printf("hello, world\n"); 

または直接fflush()を呼び出すことにより:

あなたは改行を入れてフラッシュするprintf()を引き起こす可能性があります

fflush(stdout); 

をバッファリングの詳細については、setbuf()のmanページを参照してください。

The three types of buffering available are unbuffered, block buffered, and 
    line buffered. When an output stream is unbuffered, information appears on 
    the destination file or terminal as soon as written; when it is block 
    buffered many characters are saved up and written as a block; when it 
    is line buffered characters are saved up until a newline is output or input 
    is read from any stream attached to a terminal device (typically stdin). 
    .... 
    If a stream refers to a terminal (as stdout normally does) it is 
    line buffered. 
    .... 
    The standard error stream stderr is always unbuffered by default. 
9

putsも(標準出力用)、インタラクティブであると判断することができるデバイス上で、デフォルトで洗い流す原因と改行文字を出力しているためです(a)の

あなたの最初のprintfは、末尾の改行を出力する場合は、同様の効果が表示されます。sleep()コールの前に

printf("hello, world\n"); 

fflush (stdout);場合を。

C11の関連部分は7.21.3 Filesある、セクション/7

プログラムの起動時に、3つのテキストストリームが事前に定義されており、明示的 開放する必要はない - (従来の入力を読み取るための)標準入力、標準出力(書き込みの場合は 従来出力)、標準エラー(診断出力の書き込みの場合)。最初に が開かれたので、標準エラーストリームは完全にバッファされません。 の出力ストリームは、ストリームが を対話型デバイスに参照しないと判断できる場合にのみ、完全にバッファリングされます。

これは、バックC89/90 4.9.3 Filesの日に思わせる:プログラム起動時に

を、3つのテキストストリームがあらかじめ定義されており、明示的にオープンする必要はない---(従来の入力を読み取るための)標準入力、標準出力(従来の出力を書き込むため)、および標準エラー(診断出力を書き込むために)が含まれます。オープンすると、標準エラーストリームは完全にバッファされません。ストリームが対話型デバイスを参照しないと判断できる場合にのみ、標準入力ストリームと標準出力ストリームが完全にバッファリングされます。


(a)の:それはかなりそのシンプルではありません。まず、インタラクティブデバイスを構成するものはインプリメンテーション依存であることが標準によって示されているため、実装に依存します(の動作はですが、動作には影響しません)。

2番目(here)の標準では、標準出力が完全に(デバイスが対話型ではない場合)になったときにのみ要求されます。インタラクティブデバイスのバッファリングされていないかラインバッファされているかは実装の決定です。

+0

確かな答え。あなたは、標準がC89以来この方法であると言えば、私はあなたに私の答えの上にあなたを置く+1を与えるでしょう:) –

+1

私はいくつかの安い担当者を渡すことができますか?私はたった今ハードディスクにc90を置いてしまった。今私は家に帰ることができ、妻に「決して何も投げない」戦略に利点があると言うことができます。彼女はそれについて幸せではありません:-) – paxdiablo

0

改行\nが存在する場合、printfはストリームをフラッシュします。 puts、わかりません。実装に依存している可能性があります。

あなたの睡眠は、ストリームをフラッシュするのに\nが含まれていないprintfのために十分です。

ストリームを必要に応じてフラッシュすることをお勧めします。fflush(stdout);次に、スリープ状態を完全に回避することができます。

関連する問題