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

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

  •  11-07-2019
  •  | 
  •  

Вопрос

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

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

Спасибо

Это было полезно?

Решение

Вы могли бы использовать символ обратного пробела (\b) вот так:

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

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

Другие советы

Вот пример кода. Вызывайте 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;
}

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

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

  2. Выведите управляющий символ.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top