【问题标题】:Print spinning cursor in a terminal running application using C使用 C 在终端运行应用程序中打印旋转光标
【发布时间】:2010-09-16 23:50:21
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: c printf


    【解决方案1】:

    你也可以使用\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 的行为符合预期。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      这是一些示例代码。任务完成时每隔一段时间调用一次 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;
      }
      

      【讨论】:

      • @JemshitIskenderov 问题是关于“标准 C”,Windows 绝对不是。只要支持 \b 字符,这将适用于标准 C。您的评论对于那些使用 Windows 的人来说是正确的,但 OP 并没有说他是......只是想指出这一点。
      • @JemshitIskenderov 在此代码中唯一需要的函数Windows.husleep
      • @RastaJedi 是 usleep 标准 C 吗?
      • 标准 C 中唯一的 sleep 是 thrd_sleep, C11+ ;)​​
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        我早就这样做了。有两种方法。

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

        2. 打印一个控制字符。

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

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

        【讨论】:

        • 没有必要使用 0x08,C 标准提供 '\b' 作为退格,这将独立于字符集工作。 0x08 假定为 ASCII。
        • @Chris Young:我在我的其他帖子中看到了这一点。好久没做这个了,不记得是什么了。我查看了一个 ASCII 表来查找数字,但该表没有快捷方式。
        猜你喜欢
        • 2011-02-04
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多