2008-10-13 6 views

Respuesta

19

podría utilizar el carácter de retroceso (\b) como esto:

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

etc. Necesita la fflush(stdout) porque normalmente la salida estándar está tamponada hasta que una nueva línea de salida.

2

He hecho eso, hace mucho tiempo. Hay dos maneras.

  1. Utilice una biblioteca como ncurses para darle control sobre el terminal. Esto funciona bien si quieres hacer un montón de este tipo de cosas. Si solo tienes uno en un pequeño lugar, obviamente es excesivo.

  2. Imprime un carácter de control.

En primer lugar se imprime "/", entonces 0x08 (retroceso), a continuación, "-", a continuación, 0x08, a continuación, "\" ....

El carácter de retroceso mueve la posición del cursor un espacio hacia atrás , pero deja el personaje actual allí hasta que lo sobrescribas. Obtén el tiempo correcto (para que no gire rápido o lento) y estás dorado.

+1

No hay necesidad de usar 0x08, los suministros C estándar '\ b' para un retroceso, y esto va a funcionar independientemente del carácter conjunto. 0x08 asume ASCII. – Chris

+0

@Chris Young: Vi eso en las otras publicaciones después de que hice la mía. No he tenido que hacer esto por tanto tiempo, no recuerdo lo que era. Miré una tabla ASCII para encontrar el número, pero la mesa no tenía el atajo. – MBCook

1

No existe una forma verdaderamente "estándar" de hacerlo, ya que la biblioteca estándar C (http://members.aol.com/wantondeb/) no proporciona funciones para realizar la salida de terminal/consola sin procesar.

En la consola de DOS/Windows, la manera estándar-ish de hacerlo es con conio.h, mientras que en Unix/Linux la biblioteca aceptado para este propósito es ncurses (ncurses encapsula básicamente el comportamiento de regulación caracteres que MBCook describe, en una modo independiente de la terminal).

10

Aquí hay un código de ejemplo. Llame advance_cursor() de vez en cuando mientras la tarea finaliza.

#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

no funcionó sin #include

+0

@JemshitIskenderov la pregunta es sobre "Estándar C", que Windows definitivamente no es. Esto funcionaría con el estándar C siempre que el carácter '\ b' sea compatible. Su comentario es correcto para aquellos que usan Windows, pero el OP no dijo que él era ... solo quería señalarlo. – RastaJedi

+0

@JemshitIskenderov la única función que se necesita es '' 'Windows.h''' en este código es' '' usleep'''. –

2

Puede también utilizar \ 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

Esto es bueno, pero si usa '\ r', volverá al principio de la línea, ¡no siempre el comportamiento deseado! '\ b' se comporta como se esperaba. –

Cuestiones relacionadas