2008-10-13 6 views

Répondre

19

Vous pouvez utiliser le caractère backspace (\b) comme ceci:

printf("processing... |"); 
fflush(stdout); 
// do something 
printf("\b/"); 
fflush(stdout); 
// do some more 
printf("\b-"); 
fflush(stdout); 

etc. Vous devez le fflush(stdout) car normalement jusqu'à ce que vous stdout en mémoire tampon une sortie nouvelle ligne.

2

Je l'ai fait il y a longtemps. Il y a deux façons.

  1. Utilisez une bibliothèque comme ncurses pour contrôler le terminal. Cela fonctionne bien si vous voulez faire beaucoup de ce genre de choses. Si vous en avez un dans un petit endroit, c'est évidemment exagéré.

  2. Imprime un caractère de contrôle.

D'abord, vous imprimer "/", puis 0x08 (backspace), puis "-", puis 0x08, puis "\" ....

Le backspace déplace la position du curseur d'un espace , mais laisse le caractère courant jusqu'à ce que vous l'écrasiez. Obtenez le bon timing (donc il ne tourne pas trop vite ou trop lentement) et vous êtes en or.

+1

Il n'y a pas besoin d'utiliser 0x08, les fournitures standard C de \ b 'pour un backspace, et cela fonctionnera indépendamment du caractère ensemble. 0x08 suppose ASCII. – Chris

+0

@Chris Young: J'ai vu ça dans les autres posts après avoir fait le mien. Je n'ai pas eu à le faire si longtemps, je ne me souviens pas de ce que c'était. J'ai regardé une table ASCII pour trouver le nombre, mais la table n'a pas eu le raccourci. – MBCook

1

Il n'y a pas vraiment de façon "standard" de le faire, car la bibliothèque standard C (http://members.aol.com/wantondeb/) ne fournit pas de fonctions pour la sortie de terminal/console brute.

Dans DOS/console Windows, la façon standard ish de le faire est avec conio.h, alors que sous Unix/Linux la bibliothèque acceptée à cet effet est ncurses (ncurses encapsule essentiellement le comportement caractère de contrôle qui MBCook décrit, dans un manière indépendante du terminal).

10

Voici un exemple de code. Appelez advance_cursor() de temps en temps pendant que la tâche se termine.

#include <stdio.h> 

void advance_cursor() { 
    static int pos=0; 
    char cursor[4]={'/','-','\\','|'}; 
    printf("%c\b", cursor[pos]); 
    fflush(stdout); 
    pos = (pos+1) % 4; 
} 

int main(int argc, char **argv) { 
    int i; 
    for (i=0; i<100; i++) { 
    advance_cursor(); 
    usleep(100000); 
    } 
    printf("\n"); 
    return 0; 
} 
+0

cela n'a pas fonctionné sans #include

+0

@JemshitIskenderov la question est sur "Standard C", ce qui n'est absolument pas le cas de Windows. Cela fonctionnerait avec C standard tant que le caractère '\ b' est supporté. Votre commentaire est correct pour ceux qui utilisent Windows, mais l'OP n'a pas dit qu'il était ... je voulais juste le signaler. – RastaJedi

+0

@JemshitIskenderov la seule fonction '' '' Windows.h''' est nécessaire car dans ce code est '' 'usleep'''. –

2

Vous pouvez également utiliser \ r:

#include <stdio.h> 
#include <unistd.h> 

void 
advance_spinner() { 
    static char bars[] = { '/', '-', '\\', '|' }; 
    static int nbars = sizeof(bars)/sizeof(char); 
    static int pos = 0; 

    printf("%c\r", bars[pos]); 
    fflush(stdout); 
    pos = (pos + 1) % nbars; 
} 

int 
main() { 
    while (1) { 
     advance_spinner(); 
     usleep(300); 
    } 

    return 0; 
} 
+0

C'est bon, mais si vous utilisez '\ r', il retournera au début de la ligne - pas toujours le comportement désiré! '\ b' se comporte comme prévu. –

Questions connexes