1
int main()
{
    printf("Hello"); // doesn't display anything on the screen

    printf("\n"); // hello is display on the screen

    return 0;
}

改行を受信するまで、すべての文字 (印刷候補) をバッファリングしますか? 正しい?

Q1 - ターミナルで印刷する前に、改行文字まで待機するのはなぜですか?

Q2 - 最初の printf (つまり ) の文字はどこに"Hello"バッファリングされますか?

Q3 ・印刷の流れprintf()->puts()->putchar()→今どこ?運転者?ドライバには、\n まで待機するコントロールがありますか?

Q4 - プロセスに関連付けられているロール stdout は何ですか?

詳細な画像を探しています。何かが意味をなさない場合は、自由に質問を編集してください。

4

4 に答える 4

3

printf画面に直接書き込むのではなく、デフォルトでバッファリングされる出力ストリームに書き込みます。この理由は、画面が添付されていない可能性があり、出力もファイルに送信される可能性があるためです。パフォーマンス上の理由から、毎回書き込むよりも、ディスクへのアクセスがバッファリングされ、適切なサイズのチャンクを使用して 1 つのステップで実行される方がシステムに適しています。

バッファのサイズを変更して 0 に設定することもできます。これは、すべての出力がターゲットに直接送信されることを意味し、ログの目的に役立つ場合があります。

setbuf(stdout, NULL);

バッファーは、いっぱいになったとき、または改行を出力するなど、特定の基準が満たされたときにフラッシュされます。したがって、printf をループで実行すると、間に改行がない限り、チャンクで書き出されることに気付くでしょう。

于 2014-02-27T06:12:37.310 に答える
1

はい、デフォルトでは、標準出力は端末に接続されたときに行バッファリングされます。バッファーはオペレーティング システムによって管理されるため、通常は気にする必要はありません。

setbuf()またはsetvbuf()を使用してこの動作を変更できます。たとえば、バッファーなしに変更できます。

setbuf(stdout, NULL);

printfputs、のすべての関数はputchar標準出力に出力するため、同じバッファーを使用します。

于 2014-02-27T06:12:43.773 に答える
1

必要に応じて、新しい行の前の文字を呼び出すことで、文字をフラッシュすることができます

fflush(stdout);

これは、各文字が改行なしで出力される進行状況バーのようなものをゆっくりと出力する場合に便利です。

int main()
{
    printf("Hello"); // Doesn't display anything on the screen
    fflush(stdout);  // Now, hello appears on the screen
    printf("\n");    // The new line gets printed
    return 0;
}
于 2014-02-27T06:18:03.823 に答える