Imprima el cursor giratorio en una aplicación de ejecución de terminal usando C

3 minutos de lectura

¿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

avatar de usuario
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.

avatar de usuario
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_sleepC11+ 😉

    – 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.

  1. 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.

  2. 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.hmientras 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).

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad