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.

Comments

comments powered by Disqus