2016-03-26 21 views
2

Ich möchte die Sekunden in Echtzeit seit dem Programmstart gedruckt drucken. Zuerst ist der Ausgang "0". Nach einer Sekunde wird die "0" durch "1" ersetzt, und so weiter. Hier ist der Code, den ich ursprünglich geschrieben habe.Drucken, verzögern und löschen Sie die aktuelle Zeile in C

#include<stdio.h> 
#include<time.h> 

void main() 
{ 
    long int time; 

    printf("Hello, let us measure the time!\n"); 

    time=clock(); 
    printf("%ld", 0); 

    while(time/CLOCKS_PER_SEC<7) 
    { 
     time=clock(); 
     if(time%CLOCKS_PER_SEC==0) 
     { 
      printf("\r"); 
      printf("%ld", time/CLOCKS_PER_SEC); 
     } 
    } 
} 

Dies ergab einen Ausgang "7" am Ende von nur 7 Sekunden.

Wenn ich die folgenden Ersetzungen mache, funktioniert der Code gut.

printf("%ld", 0); 

von

printf("%ld\n", 0); 

und

  printf("\r"); 
      printf("%ld", time/CLOCKS_PER_SEC); 

von

  printf("\33[A"); //vt100 char, moves cursor up 
      printf("\33[2K"); //vt100 char, erases current line 
      printf("%ld\n", time/CLOCKS_PER_SEC); 

Das Problem scheint, dass der Ausgang wird nicht, bis die aktuelle Zeile vollständig bestimmt wird gesendet. Was passiert hier?

Ich benutze GCC-Compiler auf Ubuntu.

+0

'fflush (stdout);' – hyde

Antwort

2

Der Ausgabestrom, mit dem Sie mit printf() schreiben, puffert, bis der Zeilenumbruch empfangen wird. Da Sie keine neue Zeile senden, erhalten Sie keine Flush, bis Ihre Anwendung beendet oder der Puffer voll wird.

Sie können den Ausgabepuffer nach jedem printf() selbst spülen, wie hyde im obigen Kommentar mit fflush (stdout) sagte.

Oder Sie können die Pufferung deaktivieren, indem Sie setbuf (stdout, NULL) verwenden;