¿Cómo imprimiría un cursor giratorio en una utilidad que se ejecuta en una terminal usando C estándar?
Estoy buscando algo que imprima: \ | / – una y otra vez en la misma posición en la pantalla?
Gracias
¿Cómo imprimiría un cursor giratorio en una utilidad que se ejecuta en una terminal usando C estándar?
Estoy buscando algo que imprima: \ | / – una y otra vez en la misma posición en la pantalla?
Gracias
greg hewgill
Puede 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. Necesitas el fflush(stdout)
porque normalmente la salida estándar se almacena en búfer hasta que genera una nueva línea.
Diego Zamboni
Aquí hay un código de ejemplo. Llame a advance_cursor() de vez en cuando mientras se completa la tarea.
#include <stdio.h>
void advance_cursor() {
static int pos=0;
char cursor[4]={"https://stackoverflow.com/",'-','\\','|'};
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;
}
@JemshitIskenderov, la pregunta es sobre el “Estándar C”, que definitivamente no es Windows. Esto funcionaría con el estándar C siempre que el \b
el carácter es compatible. Su comentario es correcto para aquellos que usan Windows, pero el OP no dijo que él era … solo quería señalarlo.
– RastaJedi
25/04/2016 a las 21:57
@JemshitIskenderov la única función Windows.h
es necesario para en este código es usleep
.
-Chuck Claunch
13 de febrero de 2017 a las 3:47
@RastaJedi es usleep
estándar C?
– Alessandro Jacopson
19/09/2017 a las 16:35
El único sueño en el estándar C es thrd_sleep
C11+ 😉
– Antti Haapala — Слава Україні
9 de agosto de 2019 a las 2:25
También puedes usar \r:
#include <stdio.h>
#include <unistd.h>
void
advance_spinner() {
static char bars[] = { "https://stackoverflow.com/", '-', '\\', '|' };
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;
}
Esto es bueno, pero si usas \r
luego volverá al comienzo de la línea, ¡no siempre el comportamiento deseado! \b
se comporta como se esperaba.
–Christian Mann
30 de mayo de 2011 a las 7:34
Lo he hecho, hace mucho tiempo. Hay dos maneras.
Use una biblioteca como ncurses para darle control sobre la terminal. Esto funciona bien si quieres hacer muchas cosas de este tipo. Si solo colocas esto en un pequeño lugar, obviamente es una exageración.
Imprime un carácter de control.
Primero imprime “https://stackoverflow.com/”, 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 sobrescriba. Obtenga el tiempo correcto (para que no gire demasiado rápido o lento) y estará listo.
No existe una forma verdaderamente “estándar” de hacer esto, ya que la biblioteca estándar de C (http://members.aol.com/wantondeb/) no proporciona funciones para hacer salida de terminal/consola sin procesar.
En la consola DOS/Windows, la forma estándar de hacerlo es con conio.h
mientras que bajo Unix/Linux la librería aceptada para este propósito es ncurses
(ncurses
básicamente encapsula el comportamiento del personaje de control que describe MBCook, de una manera independiente de la terminal).