使用C在终端运行应用程序中打印旋转光标

时间:2008-10-13 22:54:11

标签: c printf

如何在使用标准C的终端中运行的实用程序中打印旋转光标?

我正在寻找打印的内容:\ | / - 在屏幕上的相同位置反复出现?

谢谢

5 个答案:

答案 0 :(得分:21)

您可以使用退格符(\b),如下所示:

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

等。您需要fflush(stdout),因为通常stdout会被缓冲,直到您输出换行符。

答案 1 :(得分:12)

这是一些示例代码。在任务完成时,每隔一段时间调用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 :(得分:2)

很久以前,我已经这样做了。有两种方式。

  1. 使用像ncurses这样的库来控制终端。如果你想做很多这样的事情,这很有效。如果你只是一个小点,这显然有点过分。

  2. 打印控制角色。

  3. 首先打印“/”,然后是0x08(退格),然后是“ - ”,然后是0x08,然后是“\”....

    退格字符将光标位置移回一个空格,但将当前字符留在那里直到您覆盖它。获得正确的时机(因此它不会旋转到快或慢)并且你是金色的。

答案 3 :(得分:2)

您也可以使用 \ 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;
}

答案 4 :(得分:1)

没有真正的“标准”方法,因为C标准库(http://members.aol.com/wantondeb/)不提供执行原始终端/控制台输出的功能。

在DOS / Windows控制台中,标准方法是使用conio.h,而在Unix / Linux下,为此目的接受的库是ncursesncurses基本上封装MBCook描述的控制字符行为,以与终端无关的方式)。