Linux--好玩的进度条

前言

先来看看我们想要达到的进度条效果,具体代码会在文章最后面放出。 

 一、创建文件及Makefile

我们需要实现声明的定义的分离,因此创建如下三个文件。

process.h     prcess.c   main.c。

touch process.h process.c main.c

 同时还需要创建Makefile来帮助我们构建代码。

touch Makefile

vim打开Makefile进行编辑。

vim Makefile

第一行  代表mybin依赖与main.c和process.c

第二行  gcc命令,$^指第一行 “:” 右边的内容,$@指  “:”  左边的内容,即等于gcc main.c process.c -o mybin。这会生成可执行文件mybin。

第三行  .PHONY声明伪目标:clean,让clean代码一直可以执行。

第四行  代表clean没有依赖任何文件

第五行  删除命令,删除 mybin

  1 mybin:main.c process.c2     gcc $^ -o $@3 .PHONY:clean4 clean:5     rm -f mybin    

二、第一版代码

vim process.h 打开文件进行编辑。(unistd.h是后面需要用到的休眠函数头文件)

#pragma once                                                                                                                                                   
#include <stdio.h>    
#include <string.h>    
#include <unistd.h>    
void process(); 

vim process.c 

代码部分难度不高,重要的地方在于打印函数,printf("[%-100s][%3d%%][%c]\r",bar,rate,str[rate%num]);

-%100s代表向左保留100位打印字符串,%3d代表保留3位打印整形,\r代表只回车,就是将光标移动到最左边。

fflush(stdout)为刷新标准输出缓冲区,让缓冲区里面的内容输出在屏幕上。

usleep为休眠函数,单位为微秒。

#include "process.h"    #define SIZE 101    
#define STIME 1000*40    //设置休眠
const char* str = "|/-\\";    //旋转符号void process()    
{    int rate = 0;    //设置达到比率char bar[SIZE] = {0};    //先置空int num = strlen(str);    while(rate<=100)    {    printf("[%-100s][%3d%%][%c]\r",bar,rate,str[rate%num]);                                                                                                fflush(stdout);    usleep(STIME);    bar[rate++] = '#';    }    printf("\n");    
}    

vim main.c 调用一下。

#include "process.h"                                                                                int main()                                                                                      
{                                                                                                    process();                                                                                            
} 

编辑好了就wq保存并退出。

因为有了Makefile,我们在命令行直接输入make就可以完成构建了。

 ./mybin   执行一下就输出了。

三、第二版代码

在一版代码中,我们使用了一个函数将进度条打印完成,但真实的场景不是这样的,我们应该根据rate的更新,进行打印,rate更新了多少,我们才打印多少。

因此我们给第二个版本函数参数添加一个rate,函数里面也不需要循环了,目的是调用这个函数就打印一次,我通过外面的循环去控制rate来打印。

process.c添加如下代码

void process_v2(int rate)
{static char bar[SIZE] = {0};int num = strlen(str);if(rate<=100&&rate>=0){                           printf("[%-100s][%3d%%][%c]\r",bar,rate,str[rate%num]);fflush(stdout);   bar[rate] = '#';}                                                                        
}  

main.c添加如下代码去模拟下载

目标为target,当前下载为total,直到下载达到了target才能说我们下载完成了。

#define TARGET_SIZE 1024*1024 //需要下载的文件
#define DSIZE 1024*10
void download()
{int target = TARGET_SIZE;int total = 0;while(total<=target){usleep(STIME);      //休眠模拟下载需要消费的时间total+=DSIZE;       //休眠(下载)完成就添加下载好的百分比process_v2(total*100/target);  //调用打印}printf("\n");                                                                           
}

主函数再调用一下即可 

 

由于main.c用到了process.c的宏定义,因此需要将该宏定义放到process.h里才不会报错(main.c和process.c都包了头文件process.h)

process.h修改如下

我们在make后运行一下,没啥问题。

最后附上总代码

 process.h

#pragma once
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define SIZE 101
#define STIME 1000*40
void process_v1();                                                    
void process_v2(int rate);

 process.c

#include "process.h"const char* str = "|/-\\";
void process_v1()
{int rate = 0;char bar[SIZE] = {0};int num = strlen(str);while(rate<=100){printf("[%-100s][%3d%%][%c]\r",bar,rate,str[rate%num]);fflush(stdout);usleep(STIME);bar[rate++] = '#';}printf("\n");
}void process_v2(int rate)
{static char bar[SIZE] = {0};                                                 int num = strlen(str);if(rate<=100&&rate>=0){printf("[%-100s][%3d%%][%c]\r",bar,rate,str[rate%num]);fflush(stdout);bar[rate] = '#';}
}

main.c 

#include "process.h"    #define TARGET_SIZE 1024*1024 //需要下载的文件    
#define DSIZE 1024*10    
void download()    
{    int target = TARGET_SIZE;    int total = 0;    while(total<=target)    {    usleep(STIME);      //休眠模拟下载需要消费的时间    total+=DSIZE;    process_v2(total*100/target);    }    printf("\n");                                                                
}    int main()    
{    //process_v1();    download();    
}

Makefile

mybin:main.c process.c    gcc $^ -o $@    
.PHONY:clean    
clean:    rm -f mybin 

谢谢大家观看 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/233985.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程通信之信号

目录 1、Linux中的信号编号及其名字 2、信号的处理&#xff1a; 3、信号的使用 1.入门版 1.信号发送函数kill 示例&#xff1a; 2.信号处理函数的注册signal 示例&#xff1a; 2.高级版 1. 信号处理发送函数sigqueue 示例&#xff1a; 2.信号处理函数的注册sigacti…

数据结构排序——选择排序与堆排序(c语言实现)

数据结构排序——选择排序与堆排序&#xff08;c语言实现&#xff09; 今天继续排序的内容&#xff1a; 文章目录 1.选择排序1.1基本介绍1.2代码实现1.2.1基础款1.2.2进阶款 2.堆排序2.1基本介绍2.2代码实现 1.选择排序 1.1基本介绍 选择排序&#xff08;Selection Sort&#…

2023年最具影响力的十大网络安全事件,文件销毁,数据销毁,保密销毁,物料销毁,回收电脑 硬盘销毁

被业内人士定性为网络安全“灾年”的2023年已经翻篇&#xff0c;但过去一年发生的创记录的数据泄露、勒索软件、零日漏洞、间谍软件和供应链攻击事件已经为2024年全球网络安全威胁态势定下了主旋律和基调。 以下我们将回顾各行业2023年最具影响力和破坏力的十大网络安全事件&am…

十、基本对话框大集合(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 一、设计需求 Qt提供了很多标准的对话框。例如标准文件对话框(QFileDialog)、标准颜色对话框(QColorDialog)、标准字体对话框 (QFontDialog)、标准输入对话框 (QInputDialog) 及消息对话框 (QMessageBox)。本文展示各…

leecode | 字符串中的额外字符

题意&#xff1a;给定一个s字符串&#xff0c;和一个字典 字符串数组d&#xff0c;现在将字符串通过字典中的字符串数组把s切分&#xff0c;求最后剩下无法再切的字符串的长度思路&#xff1a;动态规划 倒着切 s[n-1] 切不了 那么问题转换成 n-1 找到找到一个j 使得 s[j, n-1]…

基于卷积神经的车牌识别系统

项目介绍 本项目是一个基于卷积神经网络的车牌识别系统&#xff0c;旨在通过图像识别技术自动检测和识别车牌&#xff0c;并判断车牌类型。系统可以识别蓝牌、黄牌&#xff08;单双行&#xff09;、绿牌、大型新能源&#xff08;黄绿&#xff09;、领使馆车牌、警牌、武警牌&a…

C#.Net学习笔记——CLR核心机制

一、CLR基本介绍 &#xff08;1&#xff09;C(Common) L&#xff08;Language&#xff09; R&#xff08;Runtime&#xff09; IL的运行环境 &#xff08;2&#xff09;从下图可以看到&#xff0c;我们的计算机会先把我们写的语言&#xff0c;编写成IL语言&#xff0c;再给计…

21、Kubernetes核心技术 - 高可用集群搭建(kubeadm+keepalived+haproxy)

目录 一、简介 二、高可用集群架构说明 三、部署环境说明 四、高可用集群搭建 (1)、初始化所有节点 (2)、修改host文件 (3)、调整内核参数 (4)、所有节点安装Docker (4-1)、配置 docker 的阿里 yum 源 (4-2)、yum 安装 docker (4-3)、配置 docker 的镜像源 (4-4)…

攀登者2 - 华为OD统一考试

OD统一考试 分值: 200分 题解: Java / Python / C++ 题目描述 攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。 地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。 例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下…

win10录音功能大盘点,帮你轻松搞定录音

“有人知道win10系统怎么录音吗&#xff1f;在网上找到了一段英语听力&#xff0c;本来打算保存下来&#xff0c;但是发现不能下载&#xff0c;我也不会使用电脑录音&#xff0c;真的很头疼&#xff0c;有人能帮帮我吗。” 在Windows 10系统中&#xff0c;录音是一项常见但往往…

计算机网络学习笔记(四)

文章目录 1.介绍一下HTTPS的流程。2.介绍一下HTTP的失败码。3.说一说你知道的http状态码。4. 301和302有什么区别&#xff1f;5.302和304有什么区别&#xff1f;6. 请描述一次完整的HTTP请求的过程。7.什么是重定向&#xff1f;8. 重定向和请求转发有什么区别&#xff1f;9.介绍…

04 帧 Frame

文章目录 04 帧 Frame4.1 相机相关信息4.2 特征点提取4.2.1 特征点提取 ExtractORB()4.3 ORB-SLAM2对双目/RGBD特征点的预处理4.3.1 双目视差公式4.3.2 双目图像特征点匹配 ComputeStereoMatches()4.3.3 根据深度信息构造虚拟右目图像&#xff1a;ComputeStereoFromRGBD() 4.4 …

书生·浦语大模型全链路开源体系 学习笔记 第二课

基础作业&#xff1a; 使用 InternLM-Chat-7B 模型生成 300 字的小故事&#xff08;需截图&#xff09;。熟悉 hugging face 下载功能&#xff0c;使用 huggingface_hub python 包&#xff0c;下载 InternLM-20B 的 config.json 文件到本地&#xff08;需截图下载过程&#xf…

Dijkstra算法——邻接矩阵实现+路径记录

本文是在下面这篇文章的基础上做了一些补充&#xff0c;增加了路径记录的功能。具体Dijkstra的实现过程可以参考下面的这篇文章。 [jarvan&#xff1a;Dijkstra算法详解 通俗易懂](Dijkstra算法详解 通俗易懂 - jarvan的文章 - 知乎 https://zhuanlan.zhihu.com/p/338414118) …

谷歌提出「边界注意力」模型,实现超越像素级检测精度!微弱边界也逃不过

有些情况下&#xff0c;当面临分辨率较低的图像时&#xff0c;可能会在进行诸如目标检测和图像分割等任务时遇到一些挑战和阻碍。这是因为低分辨率图像可能丢失了细节信息&#xff0c;使得计算机视觉系统难以准确捕捉和理解图像中的关键特征。在这种背景下&#xff0c;传统的方…

教程:Centos6迁移旧虚拟机文件后的网络配置教程,完美解决虚拟机移动后的网络ip变化问题

博主在工作后,想整整之前大学的虚拟机集群,因此特意从之前的旧电脑把虚拟机文件给拷贝了过来,在导入到vm-workstation,顺便能启动虚拟机后,发现之前的静态ip已经跟现在的宿主机网络不一样。想着重新配置,但觉得太麻烦,故想到了修改网卡的mac地址+网卡重配置方法,完美解…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -后端架构搭建

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

普中STM32-PZ6806L开发板(有点悲伤的故事续-人灯还未了)

简介 继上篇 普中STM32-PZ6806L开发板(有点悲伤的故事) 说到 关于 普中STM32-PZ6806L开发板的LED流水灯也被烧坏掉了&#xff0c;再也无法玩流水灯, 内心充满了只会流水灯的不甘, 流水灯就是单片机的Hello World&#xff0c;怎么能没有呢&#xff1f; 事情发展 好巧不巧想起最近…

报错解决:RuntimeError: Error building extension ‘bias_act_plugin‘

系统&#xff1a; Ubuntu22.04&#xff0c; nvcc -V&#xff1a;11.8 &#xff0c; torch&#xff1a;2.0.0cu118 一&#xff1a;BUG内容 运行stylegan项目的train.py时遇到报错&#x1f447; Setting up PyTorch plugin "bias_act_plugin"... Failed! /home/m…