16

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

我正在寻找可以打印的东西:\ | / - 在屏幕上的同一位置一遍又一遍?

谢谢

4

5 回答 5

23

您可以像这样使用退格字符 ( \b):

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

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

于 2008-10-13T22:57:14.863 回答
13

这是一些示例代码。在任务完成时每隔一段时间调用一次 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;
}
于 2008-10-13T23:17:29.707 回答
3

您也可以使用\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;
}
于 2009-05-20T23:39:39.627 回答
2

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

  1. 使用像 ncurses 这样的库来控制终端。如果你想做很多这样的事情,这很有效。如果你只是把这个放在一个小地方,那显然是矫枉过正的。

  2. 打印一个控制字符。

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

退格字符将光标位置向后移动一个空格,但将当前字符保留在那里,直到您覆盖它。把握好时机(这样它就不会旋转得快或慢),你就是金子。

于 2008-10-13T22:58:14.283 回答
1

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

在 DOS/Windows 控制台中,执行此操作的标准方式是 with conio.h,而在 Unix/Linux 下,为此目的接受的库是ncursesncurses基本上以独立于终端的方式封装了 MBCook 描述的控制字符行为)。

于 2008-10-13T23:09:04.340 回答