Linux --进度条小程序更新

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

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

cpp 复制代码
#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,具体实现如下。

cpp 复制代码
#include"process.h"
#include<string.h>

#define NUM 100
#define STYLE '='
#define POINT '.'
#define PUM 7

void 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);
}

代码运行效果图:

相关推荐
weixin_436525072 小时前
linux-RabbitMQ创建虚拟主机、用户、分配权限、标签
linux·运维·服务器·rabbitmq
铁手飞鹰5 小时前
从零复现论文:深度学习域适应1
linux·pytorch·python·深度学习·ubuntu·ai·迁移学习
boonya5 小时前
Apache Doris 大数据仓库全面解析
数据仓库·apache
瑶总迷弟8 小时前
在 CentOS 7.6 上安装 Oracle WebLogic Server 12c 详细教程
linux·oracle·centos
156082072198 小时前
在飞腾D2000/8平台下ubuntu内核添加WX1860和WX1820的驱动
linux·ubuntu
心灵宝贝8 小时前
如何在 CentOS 7 上安装 bzip2-libs-1.0.6-13.el7.x86_64.rpm 文件
linux·运维·centos
云心雨禅8 小时前
WordPress提速指南:Memcached+Super Static Cache+CDN缓存网站内容
linux·服务器·数据库·缓存·memcached
2501_916007479 小时前
iOS 混淆与团队协作,研发、安全、运维、测试如何在加固流程中高效配合(iOS 混淆、ipa 加固、协作治理)
android·ios·小程序·https·uni-app·iphone·webview
鹿鸣天涯9 小时前
Kali Linux 2025.3 正式发布:更贴近前沿的安全平台
linux·运维·安全
鸠摩智首席音效师9 小时前
如何在 Apache 中启用 HSTS 以增强网络安全性 ?
网络·apache