如何创建假的“正在加载......”序列?

时间:2016-05-10 23:56:15

标签: c

所以我想让文字显示为“正在加载”,然后是3个延迟的点,让它们重新开始,如:

Loading.
Loading..
Loading...
Loading.

等等,但总是在同一条线上。

我查看了没有dos.h文件的延迟函数(因为我正在使用gcc),但我不确定如何使点消失并从第一个点重新开始。

3 个答案:

答案 0 :(得分:1)

你需要两件事。

\r或回车,将光标移回行的开头。

然后通常stdout在看到换行符之前不会显示任何内容。这称为缓冲,需要关闭。您可以使用setvbuf()执行此操作。

这是一个演示。

#include <stdio.h>
#include <unistd.h>

int
main()
{
    /* Turn off stdout buffering */
    setvbuf(stdout, NULL, _IONBF, 0);

    for(int i = 0; i < 3; i++) {
        /* Clear the current line by moving to the start,
           overwriting it with spaces, and going back to the start.
        */
        printf("\r                                             \r");

        printf("Loading");

        /* Print ... over 3 seconds */
        for(int i = 0; i < 3; i++) {
            sleep(1);
            printf(".");
        }

        sleep(1);
    }

    /* Finish it all up with a newline */
    printf("\n");

    return 0;
}

有更好的方法可以执行此操作using the curses library,但\r足以达到您的目的。

答案 1 :(得分:1)

您需要使用'\ r'字符:

while (1) {
    int i;
    for (i=1; i<=3; i++) {
        printf("Loading%s\r", i==1 ? "." : i==2 ? "..":"...");
        fflush(stdout);
        sleep(1); /* or whatever */
    }
    printf("%20s\r", " ");
}

(已修复:已添加fflush(stdout);

答案 2 :(得分:0)

字符'\ b'将光标移回一个位置。以下序列可以获得您想要的结果:

printf("Loading.");
while (not done yet) {
   delay
   printf(".");
   delay
   printf(".");
   delay
   printf("\b\b   \b\b"); // erase the last two dots, and move the cursor back again
}