Stampa il cursore rotante in un'applicazione in esecuzione sul terminale usando C

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

  •  11-07-2019
  •  | 
  •  

Domanda

Come stamperei un cursore rotante in un'utilità che gira in un terminale usando lo standard C?

Sto cercando qualcosa che stampa: \ | / - ripetutamente nella stessa posizione sullo schermo?

Grazie

È stato utile?

Soluzione

Puoi usare il carattere backspace ( \ b ) in questo modo:

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

ecc. È necessario il fflush (stdout) perché normalmente lo stdout è bufferizzato fino a quando non viene emessa una nuova riga.

Altri suggerimenti

Ecco un esempio di codice. Chiama anticipo_cursore () una volta ogni tanto mentre l'attività viene completata.

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

L'ho fatto molto tempo fa. Ci sono due modi.

  1. Usa una libreria come ncurses per darti il ??controllo del terminale. Funziona bene se vuoi fare un sacco di questo tipo di cose. Se lo fai solo in un piccolo punto, è ovviamente eccessivo.

  2. Stampa un carattere di controllo.

Prima stampi " / " ;, quindi 0x08 (backspace), quindi " - " ;, quindi 0x08, quindi " \ " ....

Il carattere backspace sposta la posizione del cursore indietro di uno spazio, ma lascia lì il carattere corrente fino a quando non lo sovrascrivi. Prendi il tempismo giusto (quindi non gira veloce o lento) e sei d'oro.

Puoi anche usare \ 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;
}

Non esiste veramente " standard " modo per farlo, poiché la C Standard Library ( http://members.aol.com/wantondeb/) non fornisce funzioni per eseguire output di terminali / console non elaborati.

Nella console DOS / Windows, il modo standard per farlo è con conio.h , mentre in Unix / Linux la libreria accettata per questo scopo è ncurses ( ncurses fondamentalmente incapsula il comportamento di controllo-carattere descritto da MBCook, in modo indipendente dal terminale).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top