c - que - lupa windows 10
Imprime el cursor giratorio en una aplicaciĆ³n de ejecuciĆ³n de terminal usando C (5)
¿Cómo imprimiría un cursor giratorio en una utilidad que se ejecuta en un terminal usando C estándar?
Estoy buscando algo que imprima: / | / - una y otra vez en la misma posición en la pantalla?
Gracias
Lo hice hace mucho tiempo. Hay dos maneras.
Use una biblioteca como ncurses para darle control sobre la 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.
Imprime un personaje de control.
Primero imprime "/", luego 0x08 (retroceso), luego "-", luego 0x08, luego "/" ....
El carácter de retroceso mueve la posición del cursor hacia atrás un espacio, pero deja el carácter actual allí hasta que lo sobreescribe. Obtén el tiempo correcto (para que no gire rápido o lento) y estás dorado.
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 DOS / Windows, la forma estándar de hacerlo es con conio.h
, mientras que en Unix / Linux, la biblioteca aceptada para este propósito es ncurses
( ncurses
básicamente encapsula el comportamiento del carácter de control que describe MBCook, en un terminal). forma independiente).
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;
}
Podría usar el carácter de retroceso ( /b
) de esta manera:
printf("processing... |");
fflush(stdout);
// do something
printf("/b/");
fflush(stdout);
// do some more
printf("/b-");
fflush(stdout);
etc. Necesita fflush(stdout)
porque normalmente stdout se almacena en el búfer hasta que se genera una nueva línea.
También puedes usar / 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;
}