Распечатать вращающийся курсор в приложении, работающем на терминале, используя C - PullRequest
15 голосов
/ 14 октября 2008

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

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

Спасибо

Ответы [ 5 ]

21 голосов
/ 14 октября 2008

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

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

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

12 голосов
/ 14 октября 2008

Вот пример кода. Время от времени вызывайте 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;
}
2 голосов
/ 21 мая 2009

Вы также можете использовать \ 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;
}
2 голосов
/ 14 октября 2008

Я давно это сделал. Есть два способа.

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

  2. Печать контрольного символа.

Сначала вы печатаете «/», затем 0x08 (возврат), затем «-», затем 0x08, затем «\» ....

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

1 голос
/ 14 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...