Imprimir cursor girando em uma aplicação em execução terminal usando C

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

  •  11-07-2019
  •  | 
  •  

Pergunta

Como eu iria imprimir um cursor girando em um utilitário que é executado em um terminal usando C padrão?

Eu estou procurando algo que imprime: \ | / -? Mais e mais na mesma posição na tela

Graças

Foi útil?

Solução

Você pode usar o caractere backspace (\b) como este:

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

etc. Você precisa do fflush(stdout) porque normalmente stdout é tamponado até que você saída uma nova linha.

Outras dicas

Aqui está um código de exemplo. advance_cursor Call () de vez em quando, enquanto os concluída da tarefa.

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

Eu já fiz isso, há muito tempo. Existem duas maneiras.

  1. Use uma biblioteca como ncurses para dar-lhe o controle sobre o terminal. Isso funciona bem se você quiser fazer um monte de este tipo de coisas. Se você apenas um presente em um pequeno ponto, é, obviamente, um exagero.

  2. Imprimir um carácter de controlo.

Primeiro você imprimir "/", então 0x08 (backspace), em seguida, "-", em seguida, 0x08, então "\" ....

O personagem backspace move a posição do cursor um espaço para trás, mas deixa o caractere atual lá até que você substituí-lo. Obter o momento certo (para que ele não gira para rápido ou lento) e você é ouro.

Você também pode 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;
}

Não há verdadeiramente "padrão" maneira de fazer isso, já que a biblioteca padrão C ( http: // members.aol.com/wantondeb/ ) não fornece funções para fazer o terminal / saída crua console.

No DOS / console do Windows, o caminho padrão-ish de fazer isso é com conio.h , enquanto em Unix / Linux a biblioteca aceita para esta finalidade é ncurses (ncurses basicamente encapsula o comportamento do controle caracteres que MBCook descreve, de uma forma independente de terminal).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top