Linux系列文章(8)编写一个进度条程序

编写进度条

在之前的文章中,我们已经学会了如何使用vim进行内容的编写,学会了make和makefile进行便捷地编译文件,今天就来实际练习一个程序,编写一个进度条

1.构思程序的结构

1.文件结构

一个进度条程序,我们需要暴露给外界的程序不能过多,所以使用头文件,源文件,和主函数文件分别编写声明以及头文件,进度条文件的主体,在主函数中测试函数是否能被调用

创建三个文件

processbar.c(函数定义处)

processbar.h(函数声明处)

main.c(函数使用处)

2.文件内容的结构

接下来我们来想一下进度条应该是什么样的,它应该是一个从左向右不断递增符号或者色块的程序,即便美术风格大相径庭,但是实现的效果就是这么个样子

------------\>

所以我们知道了,进度条应该有一个主体的填充部分,右边的标识部分,以及左右的限制部分,并且他们应该都在一行随着时间更新

2.回车换行,以及程序编写

在上面的构思中我们可能会有很多想法去设计主体填充部分和右边标识部分,用一个char类型的数组储存并不断填充里面的内容就可以了,但是该怎么做才能让内容打印在一行上呢?

我们知道在打印时\n表示光标移动到开头并下移一行,这个操作就是回车换行,可是我现在不想让他换行就像让他在同一行打印内容,因为要做到进度条的效果,该怎么办,这里引入\r表示只回车不换行,这样光标就会回到开头打印在同一行。使用sleep函数营造时间间隔的效果

但是这样又会产生新的问题,\n不止是回车换行的效果,他还会刷新缓冲区,也就是将打印的东西显示到显示器上,但是\r没有这个效果,所以在循环结束后才会打印一次,不是我们想要的效果,所以在每次循环中使用fflush(stdout),刷新缓冲区,就能够实现类似进度条的效果了

复制代码
#include "processbar.h"                                                                                                                                                                                                          
  2 #include <string.h>
  3 #include <unistd.h>
  4 
  5 const char* sign = "/-|\\";
  6 char s[NUM];
  7 
 15 void processbar(){
 16     memset(s,'\0',sizeof(s));
 17     int rate = 0;
 18     while(rate<=100){
 19         if(rate!=100)
 20             s[rate] = '>';
 21         printf("[%-100s][%d%%][%c]\r",s,rate,sign[rate%4]);
 22         fflush(stdout);
 23         s[rate++] = STYLE;
 24         usleep(100000);
 25     }
 26     printf("\n");
 27 
 28 }

注意控制好数组的大小,避免出现越界,最后效果类似下图

3.实际使用场景

我们现实生活中的进度条程序的调用一般不是我们上面自己写的那样,一般是使用函数指针进行回调,传入一个参数rate,然后显示对应rate下的情况,所以要改造我们的函数

processbar.c文件

复制代码
void processbarCore(int rate){
  8     if(rate<0||rate>100) return;
  9     if(rate!=100) s[rate] = '>';
 10     printf("[%-100s][%d%%][%c]\r",s,rate,sign[rate%4]);
 11     fflush(stdout);
 12     s[rate++] = STYLE;
 13 }

main.c文件,使用函数指针进行回调,循环在某个下载任务中进行

复制代码
#include "processbar.h"                                                                                        1 #include "processbar.h"
  2 #include <unistd.h>                                                                                           |  2 #include <string.h>
  3 typedef void(*pb)(int);                                                                                       |  3 #include <unistd.h>
  4                                                                                                               |  4 
  5 void download(pb p){                                                                                          |  5 const char* sign = "/-|\\";
  6     int cur = 0;                                                                                              |  6 char s[NUM];
  7     int total = 1000;                                                                                         |  7 void processbarCore(int rate){
  8     while(cur<=total){                                                                                        |  8     if(rate<0||rate>100) return;
  9         p(cur*100/total);                                                                                     |  9     if(rate!=100) s[rate] = '>';
 10         cur+=10;                                                                                              | 10     printf("[%-100s][%d%%][%c]\r",s,rate,sign[rate%4]);
 11         usleep(100000);                                                                                       | 11     fflush(stdout);
 12     }                                                                                                         | 12     s[rate++] = STYLE;
 13     printf("\n");                                                                                             | 13 }
 14 }                                                                                                             | 14 
 15                                                                                                               | 15 void processbar(){
 16 int main(){                                                                                                   | 16     memset(s,'\0',sizeof(s));
 17     download(processbarCore);                                                                                 | 17     int rate = 0;
 18     return 0;                                                                                                 | 18     while(rate<=100){
 19 }              

4.颜色样式设计

可以在网上搜做C语言颜色输出,可以改变进度条的样式,大家自行研究,不再赘述

相关推荐
tedcloud1236 小时前
UI-TARS-desktop部署教程:构建AI桌面自动化系统
服务器·前端·人工智能·ui·自动化·github
AC赳赳老秦9 小时前
供应链专员提效:OpenClaw自动跟踪物流信息、更新库存数据,异常自动提醒
java·大数据·服务器·数据库·人工智能·自动化·openclaw
夏日听雨眠10 小时前
LInux(逻辑地址与物理地址的区别,文件描述符,lseek函数)
linux·运维·网络
哲霖软件10 小时前
ERP 赋能非标自动化行业:破解物料与库存管理难题
运维·自动化
qq_5425154111 小时前
Ubuntu 22.04.4 LTS安装ToDesk最新版打不开,无响应?旧版本4.7.2_277版本分享
linux·ubuntu·todesk
火车叼位11 小时前
替代 Tiny Win10 的 Linux 方案:Debian XFCE 精简桌面搭建
linux·运维
小麦嵌入式12 小时前
FPGA入门(四):时序逻辑计数器原理与 LED 闪烁实现
linux·驱动开发·stm32·嵌入式硬件·fpga开发·硬件工程·dsp开发
皮卡蛋炒饭.13 小时前
传输层协议UDP
linux·网络协议·udp
大明者省13 小时前
宝塔开了端口,Ubuntu 还得开相应端口才能打通
服务器·数据库·ubuntu
syagain_zsx13 小时前
Linux指令初识(实用篇)
linux·运维·服务器