2017-01-25 34 views
5

Poniżej znajduje się prosty C Program:Dlaczego printf() nie wypisuje do pliku, gdy standardowe wyjście jest przekierowane do tego pliku?

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

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

budowy i uruchomienia, tym „Hello World” zostaną wydrukowane w terminalu:

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

Ale jeśli stdout jest przekierowywane do pliku, po pewnym czasie w pliku nadal nie ma nic:

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

Dlaczego nie printf wyjście do pliku, do którego przekierowano stdout?

+9

Z pewnością tak, ale nie spuszczasz go. –

+2

Buforowanie linii (czyli płukanie każdej linii) lub zawartość niebuforowana liniowo jest automatyczna na wielu platformach przechodzących do TTY, ale nie przechodzących do pliku. –

+0

"Ctrl + C" również nie spłukuje? –

Odpowiedz

0

Domyślnie dla terminala jest to bufor linii. Tutaj przekierowałeś standardowe wyjście do pliku. Tak więc teraz standardowe wyjście nie wskazuje terminala. Wskazuje plik. Dla pliku jest on domyślnie w pełni buforowany. Więc wypróżniasz standardowe wyjście po jego napisaniu.

Skorzystaj z odpowiedzi na ten numer question.

Jako @ js1, powiedział, musisz wywołać fflush (stdout) po napisaniu go.