7

sleep() 関数を使用しているときに puts() 関数と printf() 関数の違いが気になりました。

これが私のコードです(C言語で):

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

プログラムをコンパイルして実行すると、最初にスリープしてから「hello, worldGood, bye!」と出力するようです。

ただし、printf() の代わりに puts() を使用すると、「hello, world」と出力されてからスリープし、最後に「Good, bye」と出力されます。

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

3 に答える 3

10

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

printf()改行を入れることでフラッシュを引き起こすことができます:

printf("hello, world\n");

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

fflush(stdout);

バッファリングの詳細については、次のマニュアル ページを参照してくださいsetbuf()

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.
于 2013-02-04T04:13:21.627 に答える
9

これputsは、インタラクティブであると判断できるデバイスでは、デフォルトでフラッシュを引き起こす改行文字も出力しているためです (標準出力の場合) (a)

printf最初に最後に改行を出力すると、同様の効果が見られるはずです。

printf("hello, world\n");

またはあなたが電話fflush (stdout);の前にいる場合。sleep()

の関連部分C117.21.3 Files、セクション/7です。

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

これは、次の時代にまでさかのぼりますC89/90 4.9.3 Files

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


(a) : それほど単純ではありません。手始めに、これは実装依存です。なぜなら、標準では、対話型デバイスを構成するものは実装依存であると述べられているからです (動作は指定されていますが、その動作に影響を与えるものは指定されていません)。

第 2 に (ここのように)、標準は、標準出力が完全にバッファリングされたとき (デバイスが明らかにインタラクティブでないとき) にのみ義務付けます。対話型デバイス用にバッファなしにするかライン バッファリングするかは、実装上の決定事項です。

于 2013-02-04T04:12:32.990 に答える
0

私が理解していることから、改行\nが存在する場合、printf はストリームをフラッシュします。よくわかりません。実装に依存する場合があります。

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

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

于 2013-02-04T04:12:46.120 に答える