Imprimir cursor girando em uma aplicação em execução terminal usando C
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
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.
-
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.
-
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).