C 睡眠方法阻碍输出到控制台

C sleep method obstructs output to console

我有一个 C 程序,我只是想测试我是否可以在安装模块时重现 npm install 中使用的控制台微调器。这个特殊的旋转器只是按以下顺序旋转:

| / - \

在同一个space上,所以我使用了下面的程序:

#include <stdio.h>

int main() {
    char sequence[4] = "|/-\";

    while(1) {
        for(int i = 0; i < 4; i++) {
            // \b is to make the character print to the same space
            printf("\b%c", sequence[i]);
            // now I want to delay here ~0.25s
        }
    }
}

所以我找到了一种方法让它从 <time.h> documentation 开始休息那么久,并制作了这个程序:

#include <stdio.h>
#include <time.h>

void sleep(double seconds) {
    clock_t then;

    then = clock();

    while(((double)(clock() - then) / CLOCKS_PER_SEC) < seconds); //do nothing
}

int main() {
    char sequence[4] = "|/-\";

    while(1) {
        for(int i = 0; i < 4; i++) {
            printf("\b%c", sequence[i]);
            sleep(0.25);
        }
    }
}

但是现在没有任何内容打印到控制台。有谁知道我怎样才能产生我想要的行为?

编辑 根据流行的观点,我将上面的代码更新为以下内容:

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

int main() {
    char sequence[4] = "|/-\";

    while(1) {
        for(int i = 0; i < 4; i++) {
            printf("\b%c", sequence[i]);
            /* fflush(stdout); */
            // commented out to show same behavior as program above
            usleep(250000); // 250000 microseconds = 0.25 seconds
        }
    }
}

写入控制台后需要刷新。否则,程序将缓冲您的输出:

fflush(stdout);

事情确实被打印到控制台,只是没有被刷新。添加 fflush(stdout) 以查看结果,或通过调用 setbuf:

将控制台设置为无缓冲模式
setbuf(stdout, NULL);

您的代码的一个更大问题是您的 sleep 方法运行一个繁忙的循环,无缘无故地消耗 CPU 个循环。更好的替代方法是调用 usleep,它需要微秒数:

usleep(25000);

睡眠功能不是你的问题。问题是输出被缓冲了。最简单的事情就是研究 ncurses。

现在:

fflush(stdout);