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ściowegoprintf("\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.