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

linux小程序-进度条

文章目录

  • pro.h
  • pro.c
  • main.c
  • makefile
  • 测试

pro.h

#pragma once#include <stdio.h>typedef void(*callback_t)(double, double);void probar(double total, double current);

pro.c

#include "pro.h"
#include <string.h>
#include <unistd.h>
#define Length 101
#define Style '='const char *lable = "|/-\\";
void probar(double total, double current)
{char bar[Length];memset(bar, '\0', sizeof(bar));int len = strlen(lable);int cnt = 0;double rate = (current*100.0)/total;int loop_count = (int)rate;while(cnt <= loop_count){bar[cnt++] = Style;//usleep(20000);}printf("[%-100s][%.1lf%%][%c]\r", bar, rate, lable[cnt%len]);fflush(stdout);
}

1.定义和初始化:
定义了一个长度为101的字符数组 bar 用于存储进度条。
使用 memset 将 bar 初始化为全零(\0),确保进度条初始为空。
定义了一个标签 lable(注意这里应该是 label,可能是个拼写错误),用于在进度条右侧显示一个动态变化的字符,以增加视觉效果。

2.计算进度:
计算当前进度的百分比 rate,即 current 除以 total 后乘以100。
将 rate 转换为整数 loop_count,表示进度条中应该有多少个字符被 Style(这里定义为 ‘=’)填充。

3.构建进度条:
使用 while 循环,将 bar 数组的前 loop_count 个位置填充为 Style。
注意,这里有一个潜在的改进点:如果 rate 是整数,则最后一个字符(如果有)将不会被更新为 lable 中的字符,因为 cnt 刚好等于 loop_count 时循环就结束了。

4.输出进度条:
使用 printf 格式化输出进度条,[%-100s] 确保进度条左对齐并填充空白以达到100个字符的宽度,[%.1lf%%] 显示进度百分比(保留一位小数),[%c] 显示 lable 中的一个动态变化的字符。
使用 \r 回车符,使得新的进度条会覆盖旧的进度条,从而实现动态更新的效果。
调用 fflush(stdout); 确保输出立即被刷新到屏幕上。

main.c

#include"pro.h"
#include<unistd.h>double bandwidth=1024*1024*1.0;void download(double filesize,callback_t cb)
{double current=0.0;printf("download begin,current:%lf\n",current);while(current<=filesize){cb(filesize,current);usleep(100000);current+=bandwidth;}printf("\ndownload done,filesize:%lf\n",filesize);
}int main()
{download(100*1024*1024,probar);return 0;
}

makefile

processbar:main.c pro.cgcc -o $@ $^
.PHONY:clean
clean:rm -f processbar

测试

在这里插入图片描述


http://www.mrgr.cn/news/17581.html

相关文章:

  • 详解JavaScript
  • Yolov5 AI学习笔记
  • MySQL唯一索引大小写敏感性问题及字符集深入解析
  • linux udev
  • Codeforces Round 970 (Div. 3) A~F
  • 深度学习速通系列:贝叶思和SVM
  • STM32+W5500实现以太网通信
  • [创业之路-145] :做项目做产品,50米/100米短跑与马拉松长跑,跑法不同,几人的小分队作战与兵团战役,打法不同
  • 【Kubernetes】持久卷声明 PVC
  • 机器学习之监督学习(二)逻辑回归(二元分类问题)
  • 基于SpringBoot+Vue+MySQL的的宠物商城网站
  • Self-study Python Fish-C Note20 P64to65
  • 电阻器件的选型
  • Open3D mesh 均值滤波
  • [Algorithm][综合训练][循环汉诺塔][kotori和素因子][dd爱科学]详细讲解
  • Spring MVC 框架简介与实例
  • vector模拟实现迭代器失效
  • 【Kubernetes】持久卷的动态供给 Dynamic Provisioning
  • HX711—称重模块
  • 18. 为什么浮点类型不支持左移和右移运算符?