16 May 2009

Pokazywanie postępu w programie konsolowym

Jedną z zasad pisania programów w konsoli powinno być pokazanie użytkownikowi, że program wciąż pracuje np. wykonuje jakąś długą operację - dzięki temu, użytkownik go po prostu bestialsko nie ubije. Sprawa jest dosyć prosta:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char **argv) {
    unsigned int i = 0;
    unsigned int end = 0x99;
    struct timespec go_sleep_for;


    go_sleep_for.tv_sec=0;
    go_sleep_for.tv_nsec=9999999; //999999999;

    for (i=0 ; i<=end ; i++) {
 printf("\r%d of %d",i,end);
 fflush(stdout);
 nanosleep(&go_sleep_for,NULL);
    }
    printf("\n");
}

Jak to działa?

Otóż całym sekretem są dwie linie:
  • fflush(stdout); - zmusza program do opróżnienia strumienia wyjściowego
  • printf("\r%d of %d",i,end); - drukuje (cyferki) postęp poprzedzony przez \r - znak powrotu karetki
To chyba na tyle :) - proste ale może się komuś przydać szczególnie jeśli zapomni o fflush - co na początku przygody z językiem C się zdarzyło. Co ciekawe działa ten sposób też w innych językach - więc nie jest on "C specific". Artykuł pochodzi z odmętów mojego dysku. Kompilacja i uruchomienie tego cudu techniki to: gcc animation_line.c ; ./a.out pod warunkiem, że powyższa treść została zapisana w zbiorze animation_line.c znajdującym się w katalogu w którym mamy uruchomioną konsole.

No comments:

Post a Comment