Linux实现简单进度条(附原理解释和动图效果)

1,行缓冲区

先看下面的代码和运行结果,

#include<stdio.h>
#include<unistd.h>
int main()
{
  printf("你好\n");
  sleep(3);
  return 0;
}

只是一个简单的打印“你好”然后休眠三秒,最后程序结束

再看下面的代码和运行结果: 

#include<stdio.h>
#include<unistd.h>
int main()
{
  printf("你好");
  sleep(3);
  return 0;
}

这串代码中我们把printf里面的 ' \n ' ,去掉了,那么运行结果就不同了,就变成了先休眠三秒,然后再打印的“你好”。该现象证明了,打印的时候,系统和屏幕中间是存在缓冲区的。

显示器对应的是行刷新,就是当缓冲区写满或者代码执行时遇到 ' \n ' 时,才会显示到屏幕上,至于原因我们到IO流部分会详细讲解,目前阶段可以通过“Linux下一切皆文件”的概念把屏幕也看成一个文件。  所以上面的第二个代码是先休眠三秒然后程序结束前把缓冲区数据刷新到屏幕上。

2,\n 与 \r

\n:我们很熟悉,就是换行

\r:这个我们用的不多,它表示使光标回到本行行首

简单来说,我们键盘上的回车键也就是Enter,按下代表 ‘ \n+\r ’。所以 \r代表回到本行行首,那么我们可以简单写一个程序,使运行后在同一个位置打印1 - 10,不换行,覆盖打印,如下代码

#include<stdio.h>
#include<unistd.h>
int main()
{
  int i = 1;
  for(i = 1; i <= 10; i++)
  {
    printf("%d\r", i);
    fflush(stdout); //ffush表示强制刷新缓冲区,是刷新缓冲器的形式之一,其他刷新缓冲区的策略我们到文件系统再详细展开
    sleep(1);
  }
  return 0;
}

3,进度条代码和展示

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

#define NUM 102

int main()
{
    char bar[NUM];
    memset(bar,0,sizeof(bar));
    const char* lable="|/-\\"; //进度条后面4个符号
    int cnt =0;
    while(cnt <= 100)
    {
       // printf("%s\n",bar);//打印,但是分行打印
        printf("[%-100s][%d%%] %c\r",bar,cnt,lable[cnt%4]); //利用\r,实现覆盖打印
        bar[cnt++] = '#';
        fflush(stdout);
        usleep(50000); //以后时间可以根据需求自定义
    }
    printf("\n"); //换行,防止最后shell的命令提示符信息覆盖掉进度条打印
    return 0;
}

  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值