手把手教你如何在Linux下写进度条小程序(附源码)

news/2024/7/20 2:42:55 标签: linux, 小程序, 运维

效果展示

录屏2023

一、建立文件

mkdir ProgressBar   //在当前目录下,建立新的目录
cd ProgressBar      //进入这个目录
touch main.c  makefile  progressbar.c  progressbar.h //在ProgressBar这个目录建立这几个文件

进入ProgressBar这个目录之后,使用ls命令查看是否创建成功

二、编写makefile文件

编写makefile文件是为了,使用make命令构建我们的.c文件,生成可执行程序

progressbar:progressbar.c main.c
	gcc -o $@ $^

.PHONY:clean
clean:
	rm -f progressbar

三、源码

把源码复制粘贴到我们对应的文件中

1. 头文件.h

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#define DOWNLOAD 1024*1024*1024 //1GB,下载的总大小
#define MAX 102   //str数组的长度
#define S '='      //数组的进度表示符号
void ProgressBar();   //函数声明

使用vim指令先打开头文件

vim progressbar.h

按小写i,进入插入模式(Insert),直接拷贝上去

再按esc,直接输入:wq(必须手动输入,这里不可以复制,而且必须有分号)

esc是让我们进入底行模式,按:wq是保存并退出,之后按同样的步骤完成下面几个文件的拷贝

2. 写函数定义的.c文件

#include "progressbar.h"
char str[MAX] = "\0"; //这里要定义一个全局字符数组,防止每次调用这个函数都要开辟空间,销毁空间,影响效率
char *ch = ". ";      // 这个字符串是为了表示下载一直在进行中,即使下载卡顿,也会转动,表示一直在下载;这里ch的字符串可以自己设定转动的字符,我这里设置的是.和空格,表示闪烁
int i = 0;            // 全局变量i,控制表示下载进行中的转动速度
void Init(int p)      //初始化进度条的内容,根据下载百分比来的,用图形表示当前的进度
{
	char *cur = str;
	for(int j = 0; j < p; j++)
	{
		str[j] = S;
	}
}
void ProgressBar(double percentage) //完成打印进度条的工作
{
	int len = strlen(ch);     //len是ch字符串的长度,让ch这个字符串一直在循环输出
    int p = (int)percentage;   //这里强转一下percentage是因为,p是表示str数组的下标
	if(percentage >= 100)      //如果下载百分比达到100.或者是大于100,就让他是100,符合我们日常逻辑
		percentage = 100;
	Init(p);                   //得知下载百分比之后,进入初始化str
    printf("[%-100s][%.2f%%][%c]\r", str, percentage, ch[i%len]);   //这里就是打印进度条
    fflush(stdout); //强制刷新缓冲区
	i++;           //让i不断增大
	i %= len;        //但是不能超过ch的长度
}

3. main函数的.c文件(函数调用的文件)

#include "progressbar.h"
void DownLoad()
{
    srand(time(NULL)^1023);  //设置一个随机数,用来分配速度
    int download = DOWNLOAD; //下载总量,可以自己设定
    int alreadydown = 0;     //已经下载的大小
    double percentage = 0;   //下载百分比
    int v = 0;               //下载速度
    while(alreadydown < download) //循环条件就是我们下载量是否大于总大小
    {
        usleep(100000); //休眠时间
        v = rand()%(1024*1024*40); //从随机数赋值速度,%后面的数字,是为了不让这个速度超过这个数字
        alreadydown += v;          //每次下载累积
        percentage = alreadydown*100.0 / download; //下载百分比*100,让我们更好查看,否则下完百分比是0.99,1.00等不好看
        ProgressBar(percentage);  //调用函数,这里函数主要完成打印进度条
    }
    printf("\n安装完毕!\n");
}
int main()
{
    DownLoad();
    return 0;
}

四、运行

拷贝完成后,直接使用下面指令

make

然后ls一下,会看到有一个可执行程序生成

运行这个可执行程序

./progressbar

至此我们就可以看到进度条的生成了~

五、处理

如果想删除所有文件

rm -rf *
cd ..
rm -rf ProgressBar

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

相关文章

SpringBoot——LiteFlow引擎框架

优质博文&#xff1a;IT-BLOG-CN 一、LiteFlow 简介 LiteFlow是一个轻量且强大的国产规则引擎框架&#xff0c;可用于复杂的组件化业务的编排领域。帮助系统变得更加丝滑且灵活。利用LiteFlow&#xff0c;你可以将瀑布流式的代码&#xff0c;转变成以组件为核心概念的代码结构…

SCA软件成分分析技术原理浅析

SCA软件成分分析工具可以通过静态和动态有两种技术方式实现&#xff1a; 静态分析&#xff1a;通过对源代码或二进制程序进行分析&#xff0c;从而识别被检测项目中包含的开源组件&#xff0c;开源组件本身包含的已知漏洞、组件版本信息、许可证信息等便可以查询得到&#xff…

Docker ps命令

docker ps&#xff1a;列出容器。 语法&#xff1a; docker ps [OPTIONS]OPTIONS说明&#xff1a; -a&#xff1a;显示所有的容器&#xff0c;包括未运行的。 -f&#xff1a;根据条件过滤显示的内容。 --format&#xff1a;指定返回值的模板文件。 -l&#xff1a;显示最近…

R语言实现Lasso回归

一、Lasso回归 Lasso 回归&#xff08;Least Absolute Shrinkage and Selection Operator Regression&#xff09;是一种用于线性回归和特征选择的统计方法。它在回归问题中加入了L1正则化项&#xff0c;有助于解决多重共线性&#xff08;多个特征高度相关&#xff09;和特征选…

Harmony开发 eTs公共样式抽取

Harmony系统开发使用eTs开发过程中对于样式相同且重复使用的样式可以抽取成公共样式循环利用&#xff0c;类似于android的style样式。 import router from ohos.router import cryptoFramework from ohos.security.cryptoFramework; import prompt from system.prompt class L…

Proteus仿真--基于数码管显示的频率计设计

本文介绍基于数码管的频率计设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 本设计中80C51单片机作为主控&#xff0c;用数码管作为显示模块&#xff0c;按下按键K1后可进行频率测量并显示 仿真运行视频 Proteus仿真--数码管显示的频率计 附完整Pro…

DNS/ICMP协议、NAT技术

目录 DNS协议DNS背景域名简介 ICMP协议ICMP功能ping命令traceroute命令 NAT技术NAT技术背景NAT IP转换过程NAPTNAT技术的缺陷NAT和代理服务器 网络协议总结应用层传输层网络层数据链路层 DNS协议 DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;协议&…

cjson库打包数据实现方法

使用 cJson 库&#xff0c;在C语言环境下&#xff0c;打包一个cJson字符串&#xff1a; int CreateArryJsonString(void) {cJSON *cJsonArr cJSON_CreateArray();cJSON *sJsonObj1 cJSON_CreateObject();cJSON_AddStringToObject(sJsonObj1, "test1", "test1…