Imprimer le curseur en rotation dans une application exécutant un terminal en utilisant C

StackOverflow https://stackoverflow.com/questions/199336

  •  11-07-2019
  •  | 
  •  

Question

Comment imprimer un curseur en rotation dans un utilitaire exécuté sur un terminal utilisant le standard C?

Je cherche quelque chose qui affiche: \ | / - encore et encore dans la même position sur l'écran?

Merci

Était-ce utile?

La solution

Vous pouvez utiliser le caractère de retour arrière ( \ b ) comme suit:

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

etc. Vous avez besoin de fflush (stdout) car normalement, stdout est mis en mémoire tampon jusqu'à la sortie d'une nouvelle ligne.

Autres conseils

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;
}

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

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

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

D'abord, vous imprimez "/", puis 0x08 (retour arrière), puis "-", puis 0x08, puis "\" ...

.

Le caractère de retour arrière déplace la position du curseur d'un espace, mais y laisse le caractère actuel jusqu'à ce que vous le remplaciez. Choisissez le bon timing (pour ne pas tourner trop vite ou lentement) et vous êtes en or.

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;
}

Il n’existe pas vraiment de "standard". manière de le faire, puisque la bibliothèque standard C ( http://members.aol.com/wantondeb/) ne fournit pas de fonctions permettant d’effectuer une sortie de terminal / console brute.

Dans la console DOS / Windows, la méthode la plus classique consiste à utiliser conio.h , tandis que sous Unix / Linux, la bibliothèque acceptée à cette fin est ncurses ( ncurses encapsule le comportement du caractère de contrôle décrit par MBCook, indépendamment du terminal).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top