Linux小程序-进度条

news/2024/7/20 2:26:40 标签: linux, 小程序

进度条我将实现三个版本:

1 简单原理版本

2 实际工程实践版本

3 c语言扩展-设计颜色

首先我们需要有一些前置知识:关于行缓冲区和回车换行

行缓冲区:c/c++语言会针对标准输出给我们提供默认的缓冲区,这次的角色是输出缓冲区

输出的内容不会立马显示,而是放置在输出缓冲区内,只有当缓冲区刷新时我们才会看到输出的内容,而我们平时打印内容喜欢在其后加上\n ,其实\n就是一种刷新的策略(行刷新)

 

关于回车换行:

\n :回车+换行

\r :回车

编写进度条我们可以这样做:

每次多打印一个字符,且从头开始打印,形成覆盖效果

这里就需要用\r了,每打印完字符串后又重新回到开头,覆盖式地打印比前字符串多一个字符的字符串,因为每次打印都在同一行,视觉效果上就是进度条加载的模样了

进度条蓝图:

进度条版本1(简单原理版)

process.h

  1 #pragma once 
  2 
  3 #include<stdio.h>
  4 #include<string.h>
  5 #include<unistd.h>
  6 
  7 #define SIZE 101
  8 #define MAX_RATE 100
  9 #define STIME 1000*40//休眠时间 ,1秒=1000000微秒,usleep以微妙为计时单位,但是1秒可能太慢了,我们将速度稍微调快一点
 10 #define STYLE '#'
 11 
 12 void process_v1();  

process.c
 

  1 #include"process.h"
  2 
  3 const char *str = "|/-\\";
  4 
  5 void process_v1()
  6 {
  7     int num = strlen(str);
  8     char bar[SIZE];
  9     memset(bar,'\0',sizeof(bar));
 10     int rate = 0;
 11     while(rate<=MAX_RATE)
 12     {
 13         printf("[%-100s][%d%%][%c]\r",bar,rate,str[rate%num]);//左对齐
 14         fflush(stdout);//刷新输出缓冲区
 15         usleep(STIME);//休眠(停顿一下)
 16         bar[rate++] = STYLE;
 17     }
 18     printf("\n");                                                                                                                     
 19 }

Makefile

  1 process:process.c main.c                                                                                                              
  2     gcc $^ -o $@
  3 
  4 .PHONY:clean
  5 clean:
  6     rm -f process

main.c

  1 #include"process.h"
  2 
  3 int main()
  4 {
  5     process_v1();                                                                                                                     
  6     return 0;
  7 }

 进度条版本2(实际工程实践版本)

版本1的进度条是一次就打印完毕,不能平滑的与实际场景相结合,版本2就与实际场景相结合了,

做到:每下载一点就根据rate打印一次

process.h

  1 #pragma once 
  2 
  3 #include<stdio.h>
  4 #include<string.h>
  5 #include<unistd.h>
  6 
  7 #define SIZE 101
  8 #define MAX_RATE 100
  9 #define STIME 1000*40
 10 #define STYLE '#'
 11 #define TARGET_SIZE 1024*1024//下载文件的总大小为1MB
 12 #define DSIZE 1024*10//每次下载的大小
 13 void process_v1();
 14 void process_v2(int);  

process.c

 24 void process_v2(int rate)
 25 {
 26     int num = strlen(str);
 27     static char bar[SIZE] = {0}; //设置成静态的数组,使之能保持上次的结果                                                                                                     
 28     if(rate>=0 &&  rate<=MAX_RATE)
 29     {
 30         printf("[%-100s][%d%%][%c]\r",bar,rate,str[rate%num]);
 31         fflush(stdout);
 32         bar[rate] = STYLE;
 33     }
 34     if(rate==MAX_RATE)
 35     {
 36         memset(bar,'\0',sizeof(bar));
 37     }
 38 }

main.c

  1 #include"process.h"
  2 
  3 void download()//下载函数
  4 {
  5     int total  = 0;
  6     int target = TARGET_SIZE;//下载文件的总大小
  7     while(total<=target)
  8     {
  9         usleep(STIME);//休眠时间来模拟本轮下载花费的时间
 10         total+=DSIZE;
 11         process_v2(total*100/target);//显示下载进度
 12     }
 13     printf("\n");
 14 
 15 }
 16                                                                                                                                       
 17 int main()
 18 {              
 19     download();
 20     return 0;
 21 }
~

进度条版本3( c语言扩展-设计颜色)

process.h

  1 #pragma once 
  2 
  3 #include<stdio.h>
  4 #include<string.h>
  5 #include<unistd.h>
  6 
  7 #define SIZE 101
  8 #define MAX_RATE 100
  9 #define STIME 1000*40
 10 #define STYLE '#'
 11 #define TARGET_SIZE 1024*1024
 12 #define DSIZE 1024*10
 13 #define STYLE_BODY '='
 14 #define STYLE_HEADER '>'                                                                                                              
 15 typedef void (*callback_t)(double);//函数指针类型callback_t
 16 void process_v1();
 17 void process_v2(int);
 18 void process_v3(double);

process.c

 43 void process_v3(double rate)
 44 {
 45     int num = strlen(str);
 46     static char bar[SIZE] = {0};
 47     static int cnt = 0;
 48     if(rate>=0 &&  rate<=MAX_RATE)
 49     {
 50         cnt++;
 51         cnt = cnt>=num? 0:cnt;
 52         printf("加载中……[%-100s][%.1f%%][%c]\r",bar,rate,str[cnt]);//未加上颜色
 53         fflush(stdout);
 54         if(rate<=MAX_RATE)
 55         {                                                                                                                             
 56             bar[(int)rate] = STYLE_BODY;
 57             bar[(int)rate+1] = STYLE_HEADER;
 58         }
 59 
 60     }
 61 }

若要加上颜色可以自己去搜索c语言颜色的代码,根据喜好自行变换即可

这里使用:

printf("加载中...[\033[33;44m%-100s\033[0m]][%.1f%%][%c]\r",bar,rate,str[cnt]);   

main.c

 19 void download2(callback_t cb)
 20 {
 21     int total  = 0;
 22     int target = TARGET_SIZE;
 23     int cnt = 100;
 24     while(total<=target)
 25     {
 26         usleep(STIME);//模拟下载花费的时间
 27         total+=DSIZE;
 28         double rate = total*100.0/target;
 29         if(rate>50.0 && cnt)//模拟下载中进度条的停顿,但仍在下载
 30         {
 31             total = target/2;
 32             cnt--;
 33         }
 34         cb(rate);//回调函数
 35     }
 36     cb(MAX_RATE);
 37     printf("\n");
 38 
 39 }
 40 
 41                              
 42 int main()        
 43 {              
 44     download2(process_v3);
 45     return 0;      
 46 }        

 


http://www.niftyadmin.cn/n/5040814.html

相关文章

Jmeter对图片验证码的处理

​jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证…

计算机竞赛 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

特网科技弹性云服务SSD云硬盘

引言&#xff1a; 弹性云服务器是一种基于云计算技术的灵活可扩展的虚拟服务器。它可以根据业务需求来灵活调整服务器的配置&#xff0c;提供更高的可用性和性能。而在弹性云服务器中&#xff0c;云硬盘是一种非常重要的存储设备&#xff0c;它可以提供持久化的数据存储&#x…

WebGL HUD(平视显示器)

目录 HUD&#xff08;平视显示器&#xff09; 如何实现HUD 示例程序&#xff08;HUD.html&#xff09; 示例程序&#xff08;HUD.js&#xff09; 代码详解 在网页文字上方显示三维物体 代码详解 HUD&#xff08;平视显示器&#xff09; 平视显示器&#xff08;head…

ChatGLM2-6B 部署与微调

文章目录 一、ChatGLM-6B二、ChatGLM2-6B三、本地部署ChatGLM2-6B3.1 命令行模式3.2 网页版部署3.3 本地加载模型权重3.4 模型量化3.5 CPU部署3.6 多卡部署 四、P-tuning v2微调教程4.1 P-tuning v2 原理4.2 P-tuning v2微调实现4.2.1 安装依赖&#xff0c;下载数据集4.2.2 开始…

1.什么是jwt?jwt的作用是什么?2.jwt的三个部分是什么?三者之间的关系如何?3.JWT运行的流程是什么

1. **什么是JWT&#xff1f;JWT的作用是什么&#xff1f;** JWT&#xff08;JSON Web Token&#xff09;是一种用于在不同系统或组件之间传输信息的紧凑且安全的标准。它的作用主要有两个方面&#xff1a; - **身份验证&#xff08;Authentication&#xff09;**&#xf…

springbootAdmin对Spring Boot完美监控

参考&#xff1a; https://zhuanlan.zhihu.com/p/482499234 用于管理和监控 Spring Boot 应用程序&#xff0c; 健康 &#xff08;Health&#xff09;信息、内存信息、JVM 系统和环境属性、垃圾回收信息、日志设置和查看、定时任务查看、Spring Boot 缓存查看和管理等功能 监控…

Unity中UI组件对Shader调色

文章目录 前言一、原理在Shader中直接暴露的Color属性&#xff0c;不会与UI的Image组件中的Color形成属性绑定。因为UI的Image组件中更改的颜色是顶点颜色&#xff0c;如果需要在修改组件中的颜色时&#xff0c;使Shader中的颜色也同时改变。那么就需要在应用程序阶段传入到顶点…