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 休息一秒钟并再次打印这些文字,但是不,发生了一些奇怪的事情,它只是打印 hello-err 然后休息一秒钟并做同样的事情再次。为什么?

但是等等,然后我决定将它们打印在不同的行上,现在它可以工作了。

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 回答