Печать вращающегося курсора в приложении, использующем терминал, с использованием C

Как бы напечатать вращающийся курсор в утилите, которая работает в терминале с использованием стандартного C?

Я ищу что-то, что печатает:\|/- снова и снова в той же позиции на экране?

Спасибо

Ответы

Ответ 1

Вы можете использовать символ backspace (\b) следующим образом:

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

и т.д.. Вам нужно fflush(stdout), потому что обычно stdout буферизуется до вывода новой строки.

Ответ 2

Вот пример кода. Вызовите advance_cursor() каждый раз, пока задача завершается.

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

Ответ 3

Я уже давно это сделал. Есть два пути.

  • Используйте библиотеку, такую ​​как ncurses, чтобы дать вам контроль над терминалом. Это хорошо работает, если вы хотите сделать много такого рода вещей. Если вы только один в одном маленьком месте, это явно переполняет.

  • Распечатайте управляющий символ.

Сначала вы печатаете "/", затем 0x08 (backspace), затем "-", затем 0x08, затем "\"....

Символ обратного пробела перемещает позицию курсора назад на одно место, но оставляет там текущий символ, пока вы его не перезапишете. Получите правильное время (чтобы он не вращался, чтобы быстро или медленно), и вы золотые.

Ответ 4

Вы также можете использовать \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;
}

Ответ 5

Не существует действительно "стандартного" способа сделать это, поскольку стандартная библиотека C (http://members.aol.com/wantondeb/) не предоставляет функции для сделать исходный вывод/консольный выход.

В консоли DOS/Windows стандартно-ish способ сделать это с помощью conio.h, тогда как в Unix/Linux принято библиотека для этой цели ncurses (ncurses в основном инкапсулирует поведение управляющего символа, которое MBCook описывает, независимо от термина).