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

Linux下实现进度条(原理版本和真实版本)

Linux下实现进度条(原理版本和真实版本)


文章目录

      • Linux下实现进度条(原理版本和真实版本)
    • 一、准备知识
      • 1.1 回车和换行
      • 2.2 缓冲区问题
      • 3.3 一段测试代码
    • 二、文件准备工作
      • (1)创建文件
      • (2)Makefile配置
      • (3)头文件process.h
      • (4)源文件process.c
      • (5)源文件main.c
    • 三、进度条类型
      • 3.1 版本1:原理版本
      • 3.2 版本2:真实版本
      • 3.3 版本2:小优化
    • 四、整体代码
      • (1)Makefile文件
      • (2)main.c
      • (3)process.c
      • (4)process.h


一、准备知识

1.1 回车和换行

在这里插入图片描述


2.2 缓冲区问题

在这里插入图片描述
在这里插入图片描述


3.3 一段测试代码

在这里插入图片描述


二、文件准备工作

(1)创建文件

在这里插入图片描述


(2)Makefile配置

在这里插入图片描述


(3)头文件process.h

头文件process.h的作用主要是声明
在这里插入图片描述


(4)源文件process.c

在这里插入图片描述


(5)源文件main.c

在这里插入图片描述


三、进度条类型

3.1 版本1:原理版本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们每次打印的进度条都是在命令行。我们应该新起一行
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


3.2 版本2:真实版本

先在main函数里面写一个下载程序,充当下载数据
在这里插入图片描述
在这里插入图片描述
在这里我们还要定义一个FlushProcess函数来刷新进度条
在这里插入图片描述
在这里插入图片描述
这里也要通过Makefile改成C99标准库
在这里插入图片描述


所以接下来我们就开始process.c的第二版本的建立
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来我们要加上数量和%,并进行优化
这里加上了rate来记录速率!定义了cnt来计数

在这里插入图片描述
这里有个小问题:别忘了cnt++,要不然无法达到转圈的效果
在这里插入图片描述
但是我们注意到这里只有 99.9%,因为我们while循环中没有等号
在这里插入图片描述
在这里插入图片描述


我们还可以实现多组下载!
在这里插入图片描述
在这里插入图片描述


3.3 版本2:小优化

这里我们可以使用函数指针和回调函数优化


在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述


四、整体代码

(1)Makefile文件

代码如下(示例):

  1 SRC=$(wildcard *.c)2 OBJ=$(SRC:.c=.o)3 BIN=LinuxStudy4 5 $(BIN):$(OBJ)6     gcc -o $@ $^7 %.o:%.c8     gcc -c $< -std=c99                                                                                                   9 10 .PHONY:11 clean:12     rm -f $(OBJ) $(BIN)13     

(2)main.c

代码如下(示例):

$ cat main.c
#include "process.h"
#include <stdio.h>
#include <unistd.h>
double total = 1024.0;
double speed = 1.0;
void DownLoad()
{
double current = 0;
while(current <= total)
{
FlushProcess(total, current);
// 下载代码
usleep(3000); // 充当下载数据
current += speed;
}
printf("\ndownload %.2lfMB Done\n", current);
}
int main()
{
DownLoad();
DownLoad();
DownLoad();
DownLoad();
DownLoad();
DownLoad();
DownLoad();
DownLoad();
return 0;
}

(3)process.c

代码如下(示例):

#include "process.h"
#include <string.h>
#include <unistd.h>
#define NUM 101
#define STYLE '='
// vesion1
void process_v1()
{
char buffer[NUM];
memset(buffer, 0, sizeof(buffer));
const char *lable="|/-\\";
int len = strlen(lable);
int cnt = 0;
while(cnt <= 100)
{
printf("[%-100s][%d%%][%c]\r", buffer, cnt, lable[cnt%len]);
fflush(stdout);
buffer[cnt]= STYLE;
cnt++;
usleep(50000);
}
printf("\n");
}
// verison2
void FlushProcess(double total, double current)
{
char buffer[NUM];
memset(buffer, 0, sizeof(buffer));
const char *lable="|/-\\";
int len = strlen(lable);
static int cnt = 0;
// 不需要⾃⼰循环,填充#
int num = (int)(current*100/total); // 11.0 / 1000
int i = 0;
for(; i < num; i++)
{
buffer[i] = STYLE;
}
double rate = current/total;
cnt %= len;
printf("[%-100s][%.1f%%][%c]\r", buffer, rate*100, lable[cnt]);
cnt++;
fflush(stdout);
}

(4)process.h

代码如下(示例):

#pragma once
#include <stdio.h>
void process_v1();
void FlushProcess(double total, double current);


文章转载自:

http://dFUufGiD.LhwLp.cn
http://lUmVNtIi.LhwLp.cn
http://OhtX1d6y.LhwLp.cn
http://Cljnv8jt.LhwLp.cn
http://YSDcBiqI.LhwLp.cn
http://GQl6cGiQ.LhwLp.cn
http://x8NYwDVe.LhwLp.cn
http://59xMSiuS.LhwLp.cn
http://bzGjSbLD.LhwLp.cn
http://y9KhOK9P.LhwLp.cn
http://z4gAjlJd.LhwLp.cn
http://XMNIaEGR.LhwLp.cn
http://uqL5DZtN.LhwLp.cn
http://ddlWFO4v.LhwLp.cn
http://Qpb0hgG8.LhwLp.cn
http://J13TkIgf.LhwLp.cn
http://BINOW267.LhwLp.cn
http://zJiX2WAH.LhwLp.cn
http://COsLYKpR.LhwLp.cn
http://749EckKp.LhwLp.cn
http://3bCscQyo.LhwLp.cn
http://XcKdRq8b.LhwLp.cn
http://X0DyZzIr.LhwLp.cn
http://NYCVoEyM.LhwLp.cn
http://yWij9ERh.LhwLp.cn
http://x8EqMHcT.LhwLp.cn
http://uUWvppEJ.LhwLp.cn
http://Q0mOb3Cr.LhwLp.cn
http://8xLvahJI.LhwLp.cn
http://urhUGQI1.LhwLp.cn
http://www.dtcms.com/a/381745.html

相关文章:

  • 强化学习中重要性采样
  • 数据库备份谁更快?mydumper VS mysqldump 实测对比
  • 企业级VIP+Nginx的网络访问方案
  • MySQL保姆级安装教程
  • 指针(五)后半
  • 贪心算法在GNN邻域采样问题中的深度解析
  • MongoDB简介
  • ego(4)---检测B样条轨迹的障碍物进入点与退出点
  • mysql 与 MongoDB 的分片
  • 大语言模型基石:Transformer
  • 【Flink】窗口
  • 2.3单链表
  • [RK3566][Android13] Android->屏蔽锁屏界面的时钟和日期显示
  • jetson orin super nano(arm linux系统)上读取大恒图像工业相机(型号MER-050-560U3C)教程
  • 关于Gateway configration studio软件配置网关
  • xtuoj 随机数
  • [硬件电路-186]:二极管的伏安特性看男女关系2:二极管的正向导通电流与动态电阻成反比关系
  • 网络安全渗透测试第一步信息收集
  • 界面规范11-对话框
  • 基于QCharView类封装绘制各种图表的示例(支持自画图形)
  • IoC / DI 实操
  • 一、Python开发准备
  • 《IDEA 突然“三无”?三秒找回消失的绿色启动键、主菜单和项目树!》
  • 解释 ICT, Web2.0, Web3.0 这些术语的中文含义
  • 区块链web3项目实战-Truffle petshop
  • 区块链学习笔记
  • NFT盗窃潮:法律视野下的区块链取证技术与数字资产保卫战
  • 数据分析:合并二
  • 怎么生成qt的pro文件
  • ChatGPT全面支持MCP,带来更多可能性