【发布时间】:2010-09-16 23:50:21
【问题描述】:
如何在使用标准 C 在终端中运行的实用程序中打印旋转光标?
我正在寻找可以打印的东西:\ | / - 在屏幕上的同一位置一遍又一遍?
谢谢
【问题讨论】:
如何在使用标准 C 在终端中运行的实用程序中打印旋转光标?
我正在寻找可以打印的东西:\ | / - 在屏幕上的同一位置一遍又一遍?
谢谢
【问题讨论】:
你也可以使用\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;
}
【讨论】:
\r,那么它将返回到行首——并不总是需要的行为! \b 的行为符合预期。
您可以像这样使用退格字符 (\b):
printf("processing... |");
fflush(stdout);
// do something
printf("\b/");
fflush(stdout);
// do some more
printf("\b-");
fflush(stdout);
等等。您需要 fflush(stdout),因为通常 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;
}
【讨论】:
\b 字符,这将适用于标准 C。您的评论对于那些使用 Windows 的人来说是正确的,但 OP 并没有说他是......只是想指出这一点。
Windows.h 是usleep。
usleep 标准 C 吗?
thrd_sleep, C11+ ;)
没有真正的“标准”方式来做到这一点,因为 C 标准库 (http://members.aol.com/wantondeb/) 不提供执行原始终端/控制台输出的函数。
在 DOS/Windows 控制台中,执行此操作的标准方式是使用 conio.h,而在 Unix/Linux 下,为此目的接受的库是 ncurses(ncurses 基本上封装了控制字符行为MBCook 以独立于终端的方式描述)。
【讨论】:
我早就这样做了。有两种方法。
使用像 ncurses 这样的库来控制终端。如果你想做很多这样的事情,这很有效。如果你只是把这个放在一个小地方,那显然是大材小用了。
打印一个控制字符。
首先打印“/”,然后是 0x08(退格),然后是“-”,然后是 0x08,然后是“\”......
退格字符将光标位置向后移动一个空格,但将当前字符保留在那里,直到您覆盖它。把握好时机(这样它就不会旋转得太快或太慢),你就是金子。
【讨论】: