2017-12-05 5 views
0

überprüfen unter dem Code-Snippet, das Zeichen mit \r:Wie stdout umleiten mit ' r' auf der gleichen Zeile gedruckt?

#include <stdio.h> 
#include <unistd.h> 
int main() { 
    for(int i=1; i<=100; i++) { 
     printf("%d%%\r", i); 
     fflush(stdout); 
     usleep(1e4); 
    } 
    printf("\n"); 
    return 0; 
} 

Der Ausgang dieses Programm auf der Konsole hat nur 1 Zeile:

$ ./main 
100% 

Wenn jedoch die Ausgabe in eine Datei umgeleitet wird ./main > main.log , hat die Datei 100 Zeilen:

1% 
2% 
3% 
... 
100% 

Frage:

Wie behalte ich nur die letzte Zeile der Ausgabe in der Protokolldatei?

+1

Nicht in 'stdout' schreiben. Öffnen Sie '"/dev/tty "' als Datei und schreiben Sie darauf. Es wird nicht umgeleitet. –

+1

Wenn Sie die Datei mit 'cat' drucken, sollte es auf die gleiche Weise angezeigt werden, aber natürlich sind die zusätzlichen Daten noch da, es wird nur auf dem Terminal überschrieben. Sie können Daten, die Sie in stdout geschrieben haben, nicht abschreiben. Beachten Sie, dass "\ r" die vorherige Zeile nicht löscht, sodass Teile davon angezeigt werden, wenn die neue Zeile kürzer ist. – interjay

+0

Wenn Sie 'cat main.log', sicher, es wird 100 Zeilen enthalten, aber es wird nur die' 100% 'angezeigt, genau wie Ihr Terminal. –

Antwort

1

Ich gehe davon aus, dass dies Teil eines größeren Programms ist, in dem der "Prozentsatz" 100% sein kann oder nicht (ansonsten könnte man einfach 100% drucken). So können Sie überprüfen, ob die Ausgabe mit isatty zu einem Terminal geht. Wenn nicht, den "letzten Prozentwert" drucken:

int main(void) 
{ 
    int b = isatty(STDOUT_FILENO); 
    int i; 
    for(i=1; i<=100; i++) { 
     if (b) printf("%d%%\r", i); 
     fflush(stdout); 
     usleep(1e4); 
    } 
    if (!b) printf("%d%%\r", i-1); 
    printf("\n"); 
    return 0; 
} 
Verwandte Themen