暂停并重新启动终端输出

克里斯·米德尔顿

我想做的是让终端打印出一个字符串,暂停,然后覆盖该字符串。但是,发生的情况是该程序仅打印出最终结果,而没有显示第一个字符串。

我以为我可以sleep用来做到这一点,但这是行不通的。为什么不?

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

int main(void){

    char message[] = "Hello there";
    int messageLength = sizeof(message);
    int i;

    printf("Hello, Dave.");
    sleep(2);
    for(i = 0; i < messageLength; i++)
        printf("\b");
    printf("Anyone there?\n");

    return 0;

}

更新版本,感谢答案:

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

void twprint(char* output, int outputLength, struct timespec* delay);
void twbackspace(int length, struct timespec* delay);

int main(void){

    char message1[] = "Hello, Dave.";
    char message2[] = "Are you there, Dave?";
    char message3[] = "I heard you talking in the pod.";
    char message4[] = "Dave?";
    struct timespec duration = { .tv_sec = 0, .tv_nsec = (100 * 1000 * 1000) }; 
    /* ^ .tv_nsec = one hundred million nanoseconds */

    twprint(message1, sizeof(message1)/sizeof(char), &duration);
    sleep(2);
    twbackspace(sizeof(message1)/sizeof(char), &duration);

    twprint(message2, sizeof(message2)/sizeof(char), &duration);
    sleep(2);
    twbackspace(sizeof(message2)/sizeof(char), &duration);

    twprint(message3, sizeof(message3)/sizeof(char), &duration);
    sleep(2);
    twbackspace(sizeof(message3)/sizeof(char), &duration);

    sleep(2);
    duration.tv_nsec *= 5;
    twprint(message4, sizeof(message4)/sizeof(char), &duration);

    printf("\n");

    return 0;

}

void twprint(char* output, int outputLength, struct timespec* delay){

    int i;
    struct timespec remaining; /* dummy parameter */

    for(i = 0; i < outputLength; i++){
        printf("%c", output[i]);
        fflush(stdout);
        nanosleep(delay, &remaining);
    }

}

void twbackspace(int length, struct timespec* delay){

    int i;
    struct timespec remaining; /* dummy parameter */

    for(i = 0; i < length; i++){
        printf("\b \b");
        fflush(stdout);
        nanosleep(delay, &remaining);
    }
}
利亚姆

printf的输出已缓冲,直到缓冲区已满,您打印换行符或调用fflush(stdout)时,才将其输出到控制台。尝试:

...
printf("Hello, Dave.");
fflush(stdout);
sleep(2);
...

维基百科很好地解释了标准流及其在缓冲方面的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

暂停并重新启动终端输出

来自分类Dev

保存并重新启动已暂停的gdb会话

来自分类Dev

Spring Batch暂停并重新启动作业

来自分类Dev

暂停并重新启动所有Python进程

来自分类Dev

暂停/重新启动序列

来自分类Dev

暂停并恢复ExecutorService或关闭并重新启动Java Executor服务

来自分类Dev

如何使用requestAnimationFrame暂停并重新启动秒表计时器?

来自分类Dev

React Native中的动画可以暂停并重新启动吗?

来自分类Dev

Android在广播接收器中暂停并重新启动警报管理器

来自分类Dev

在终端上自动安装磁盘,并在用户之间持久保存并重新启动

来自分类Dev

捕获错误并重新启动if语句

来自分类Dev

中断并重新启动setTimeouts循环

来自分类Dev

终止并重新启动进程

来自分类Dev

服务崩溃并重新启动

来自分类Dev

停止setInterval并重新启动

来自分类Dev

取消并重新启动任务

来自分类Dev

关闭并重新启动挂起

来自分类Dev

systemctl休眠并重新启动?

来自分类Dev

生成回溯并重新启动

来自分类Dev

暂停时重新启动WinRT应用

来自分类Dev

重新启动前使Debian Pause暂停

来自分类Dev

重新启动前安全暂停

来自分类Dev

从暂停恢复后重新启动urfkill

来自分类Dev

如何在需要时暂停正在运行的线程并重新启动同一线程?

来自分类Dev

Rails-关闭终端并重新启动机器-现在bash告诉我未安装Rails

来自分类Dev

重新启动后保存并还原终端

来自分类Dev

重新启动终端时,PATH消失

来自分类Dev

如何从终端关闭或重新启动?

来自分类Dev

重新编译并重新启动守护程序