【Linux操作系统】实现一个简单的进度条

发布于:2023-01-20 ⋅ 阅读:(11) ⋅ 点赞:(0) ⋅ 评论:(0)

一、预备知识

  • 换行和回车的区别
    • \r:回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖,如果之前的内容比下一次来的的内容长,就不会被完全覆盖
    • \n:换行,换到当前位置的下一行,而不会回到行首
#include <stdio.h>
#include <unistd.h>

int main()
{
    //printf("hello\n");
    printf("hello");

    sleep(5);

    return 0;
}
  • printf已经执行,但是数据没有被立即刷新到显示器中,没有遇到\n字符串会暂时保存在用户C语言级别的缓冲区,然后再由缓冲区刷新到显示器中,如果一直未遇到就直到程序结束才会被刷新出来

    显示器设备刷新策略就是行刷新,即遇到\n即进行刷新

    C程序默认会打开三个输入输出流:

    stdin,stdout,stderr

    键盘 显示器 显示器

    可以使用头文件 unistd.h 下的 fflush 来刷新输出缓冲区 stdout

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

int main()
{
    //printf("hello\n");
    printf("hello");

	fflush(stdout); //刷新输出缓冲区

    sleep(5);

    return 0;
}

二、简单的倒计时

#include <stdio.h>
#include <unistd.h>
int main()
{
    int count = 20;
    while (count)
    {
        printf("%2d\r", count); //因为一共是两个字符,所以需要预留出两个字符的位置
        fflush(stdout);
        count--;
        sleep(1);
    }
    return 0;
}

三、实现

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

#define NUM 100

int main()
{
    char bar[NUM + 1];
    memset(bar, '\0', sizeof(bar));

    const char* label = "|/-\\";

    int i = 0;
    while (i <= NUM)
    {
        printf("[%-100s][%3d%%] %c\r", bar, i, label[i % 4]);
        fflush(stdout);
        bar[i] = '#';
        usleep(50000);

        i++;
    }
    printf("\n");

    return 0;
}