2017-01-25 54 views
5

下面是一個簡單的C程序:當stdout被重定向到該文件時,爲什麼printf()不會輸出到文件?

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

int main(void) 
{ 
     while (1) 
     { 
       printf("Hello World\n"); 
       sleep(1); 
     } 
} 

構建並運行它時,「Hello World」,將在終端中的印刷:

$ ./a.out 
Hello World 
Hello World 
Hello World 

但如果stdout被重定向到一個文件,運行一段時間後,文件中仍然沒有任何內容:

$ ./a.out > log.txt 
^C 
$ cat log.txt 
$ 

爲什麼printf輸出到stdout被重定向到的文件?

+9

它當然可以,但你並沒有沖洗它。 –

+2

在許多平臺上進行線路緩衝(因此沖洗每條線路)或直接無緩衝的內容都會自動轉到TTY,但不會轉到文件。 –

+0

「Ctrl + C」也不沖洗? –

回答

0

對於僅默認情況下的終端,它是行緩衝區。在這裏,您將stdout重定向到文件。所以,現在標準輸出並沒有指向終端。它指向一個文件。對於該文件,默認情況下是完全緩衝的。所以,你寫完後刷新標準輸出。

請參考此問題的答案question

作爲@ js1,說,你必須在寫完之後調用fflush(stdout)。