C语言实现一个进度条小程序

28 篇文章 0 订阅

        最近学习了Linux的常用命令,还有vim的基本使用,想着在Linux下写个简答的小程序玩玩,顺便熟悉一下vim编辑器的使用。这里写一个进度条的小程序

        本来想直接循环输出100个符号,但是还想着加一个可以显示当前加载的进度条百分比的效果,于是想到用while循环,每次重新打印进度条的内容,但是如何做到在同一行重复打印呢?

        我查了下资料,发现使用回车符\r可以回到当前行的开始,还发现了换行和回车实际上是两个不同的概念。回车是回到当前行的开始;换行是直接列不变,新起一行(我们的enter键实际上是回车并且换行) 


思路 

1.首先已定义一个char数组表示进度条,这里我们长度给101,最后一个用来放\0,表示字符串的结束(C语言中需要\0来表示一个字符串的结束),每次循环往数组中添加一个"=",间隔50ms。

2.想着加一个加载中转动的效果,定义一个rotate常量字符串,每次循环的时候依次打印|/-\,注意最后一个\想要输出的话,需要使用转义字符,要再加一个\,为了让其循环输出,我们可以让循环变量i取模4。

3.使用printf语句来控制进度条的输出,%-100s,表示输出字符串的宽度占100个字符,然后后面跟上当前进度的百分比,我们打印i即可,为了使其更加整齐,限定i宽度为3,这样i到100的时候就不会感受到进度条长度变化,最后加上%%(因为%想要输出要使用%%)。最后就是输出一个字符表示rotate了。为了每次都从当前行开始位置输出,printf最后我加上了回车符\r

4.由于printf的字符串会先被保存在C语言级别的缓冲区中,然后显示器遇到\n的时候才会刷新显示到屏幕上。我们这里没有加上换行符\n,所以我们这里需要使用fflush强制刷新缓冲区的内容到显示器上。

5.这里每次刷新内容后,调用usleep休眠50ms,1s = 1000ms,1ms = 1000us,usleep传入数字的单位是us,所以我们这里传入50000表示休眠了50ms,所以这个进度条5s就会结束(也可以用sleep,传入数字的单位是s)


代码

#include<stdio.h>    
#include<unistd.h>                                                                                                                                                                          
#include<string.h>    
int main() {    
    int count = 100;    
    int i = 0;    
    char bar[count+1];    
    const char* rotate = "|/-\\";    
    memset(bar,'\0',sizeof(bar));    
    while(i <= count) {    
        printf("[%-100s][%3d%%][%c]\r",bar,i,rotate[i%4]);    
        fflush(stdout);    
        bar[i++]='=';    
        usleep(50000);    
    }    
    return 0;    
}  

效果

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值