0
#include <stdio.h>
#include <unistd.h>

int main (){

    while(1){
        fprintf (stdout,"hello-out");
        fprintf (stderr,"hello-err");
        sleep (1);
    }

    return 0;
}

まあ、私はこれが単純に表示され、hello-out と hello-err が 1 秒の休憩を取り、それらのリテラルを再度出力すると思っていましたが、いいえ、何か奇妙なことが起こっています。hello-err を出力してから 1 秒の休憩を取り、同じことを行いますまた。なぜ?

しかし、待ってください。その後、それらを別々の行に印刷することにしましたが、今では機能しました。

fprintf (stdout,"hello-out\n");
fprintf (stderr,"hello-err\n");

- - - - - と同じ - - - - - -

fprintf (stdout,"hello-out\n");
fprintf (stderr,"hello-err");

では、ここでの '\n' の重要性は何ですか? これはフラッシングに関係していますか?「\ n」がフラッシュに使用されることを読んだためです。

また、両方のリテラルを標準出力に出力しても、出力は生成されません:(

fprintf (stdout,"hello-out");
fprintf (stdout,"hello-err");

もう一度なぜ?

4

3 に答える 3

11

デフォルトでstdoutは、ライン バッファリングされます。これは、明示的にフラッシュしない限り、\n.

stderr一方、デフォルトではバッファリングされていません。すべての書き込みはすぐに書き込まれます。

于 2013-01-24T12:18:18.250 に答える
1

私はあなたのコードをこのように変更しました

#include <stdio.h>
#include <unistd.h>

int main (){
int i;
for(i=0;i<5;i++){
    fprintf (stdout,"hello-out");
    fprintf (stderr,"hello-err");
    sleep (1);
}

return 0;
}

これで出力は

hello-errhello-errhello-errhello-errhello-errhello-out
hello-outhello-outhello-outhello-out

stderrはバッファリングされていないため、出力されます。ただし、stdoutは行バッファリングされているため、\ nが来たとき、コードが終了したとき、またはいつでも出力されます...したがって、最終的にはstdoutが出力されます。

于 2013-01-24T12:24:34.630 に答える
-3

いいえ、これはフラッシングには使用されません。これには fflush が使用されます。\n は単に改行を示します。

于 2013-01-24T12:19:56.260 に答える