当前位置: 首页 > news >正文

Linux --进度条小程序更新

这里使用随机数来模拟下载量,来实现一个下载进度更新的小程序

main.c 的代码,其中downlod这个函数使用的是函数指针,如果有多个进度条函数可以传入进行多样化的格式下载显示,还需要传入一个下载总量,每次"下载以后刷新一次进度条",具体实现如下。

#include<stdio.h>
#include<stdlib.h>
#include"process.h"
#include<time.h>const int base=100;
double total1 =2048.0;
double total2 =500.0;
double once =0.5;
typedef void (*flush_t)(double current,double total);void downlod(flush_t f,double total)
{double current=0.0;double speed=0.0;while(current <= total){int n = rand() % base + 1 ;speed=n * once;current+=speed;if(current>total){current=total;process(current,total);usleep(100000);break;}f(current,total);usleep(100000);}printf("\n");
}int main()
{srand(time(NULL));downlod(process,total1);downlod(process,total2);return 0;
}

process.c的实现与上一篇文章的方法类似,只是更改了一个下载样式 ' . ',lable使用一个数组来储存,其中点的个数由静态变量n控制,在第一个循环中当i等于NUM大小时会将最后一个字符设置为'\0',否则在打印的时候会出现“烫烫烫”等字符,这是因为字符串以'\0'作为结束标志。此次代码根据真实的应用场景,进行动态刷新,由percent控制'#'的数量。最后在打印进度条时还添加了当前下载量和总的下载量,下载完成时状态栏会显示Finish,具体实现如下。

#include"process.h"
#include<string.h>#define NUM 100
#define STYLE '='
#define POINT '.'
#define PUM 7void process(double current, double total)
{char bar[NUM/2+2];memset(bar , '\0' , sizeof(bar));int percent=(int)(current / total * 100);int i = 0;for(i = 0; i <=percent; i++){if(i % 2  == 0){bar[i/2]=STYLE;bar[i/2+1]='>';}if(i == NUM)bar[i/2+1]='\0';}char lable[PUM];static int n= 0;n++;n %= PUM;memset(lable,'\0',PUM);for(i = 0; i < PUM; i++){if (i < n )lable[i]=POINT;else lable[i]=' ';if(i == PUM-1)lable[i]='\0'; }if(percent==100){printf("已下载量: %-6.1f mb 总下载量: %-6.1f mb[%-51s][%3d%%][Finish]\r",current,total,bar,percent); }else{printf("已下载量: %-6.1f mb 总下载量: %-6.1f mb[%-51s][%3d%%][%-6s]\r",current,total,bar,percent,lable);}fflush(stdout);
}

代码运行效果图:

http://www.dtcms.com/a/215397.html

相关文章:

  • Mysql之用户管理
  • 机器学习-决策树
  • 《数据结构初阶》【番外篇:快速排序的前世今生】
  • 大型三甲医院更换HIS系统全流程分析与经验考察(下)
  • 2025 年江西研究生数学建模竞赛题C题基于大雾背景视频学习的能见度回归建模完整思路 模型代码 结果 成品分享
  • AI测试用例生成系统设计与实现:融合多模态、OCR解析与知识库增强
  • OpenGL Chan视频学习-11 Uniforms in OpenGL
  • OpenGL Chan视频学习-10 Dealing with Errors in OpenGL
  • WPF【11_7】WPF实战-重构与美化(ViewModel的嵌套与分解、海量数据不要Join)
  • 备战省赛—全国青少年信息素养大赛-图形化编程-省赛-每日一练-计算台阶
  • Frequent values/gcd区间
  • 【机器学习基础】机器学习入门核心算法:逻辑回归(Decision Tree)
  • eda学习前传又名电赛Day01
  • PIO 也有并发喔,巧用SIDE-SET
  • OpenGL Chan视频学习-8 How I Deal with Shaders in OpenGL
  • 【Doris入门】Doris初识:分布式分析型数据库的核心价值与架构解析
  • 【论文精读】2024 arXiv --VEnhancer现实世界视频超分辨率(RealWorld VSR)
  • Wan2.1 图生视频模型内部协作流程
  • 为(FramePack)的视频生成添加首尾帧功能
  • 多个vue2工程共享node_modules
  • taro + vue3 实现小程序sse长连接实时对话
  • Python的分布式网络爬虫系统实现
  • AI in Game,大模型能力与实时音视频技术融合,交出AI应用新答卷
  • ssh 测试 是否可以连通docker 容器
  • 【Sqoop基础】Sqoop生态集成:与HDFS、Hive、HBase等组件的协同关系深度解析
  • 新电脑配置五 jdk8,maven,idea,vscode
  • IT 运维老手和新手的区别:从手动运维到一体化 IT 运维系统的跨越
  • 第二十二章:数据治理之数据价值:数据价值知多少
  • 代码风格指南
  • 【DSP笔记】掌握数字世界的律动:时域离散信号与系统基础