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.mzph.cn/news/607561.shtml

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

相关文章

数据结构与算法-栈-移掉K位数字

移掉K位数字 给你一个以字符串表示的非负整数 num 和一个整数 k &#xff0c;移除这个数中的 k **位数字&#xff0c;使得剩下的数字最小。请你以字符串形式返回这个最小的数字。 示例 1 &#xff1a; 输入&#xff1a;num "1432219", k 3 输出&#xff1a;&quo…

kubernetes ingress 详解 (包含灰度发布/金丝雀部署)

写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 内容较长&#xff0c;页面右上角目录方便跳转 ingress 介绍 架构 原理 官网资料&#xff1a;Ingress 控制器 | Kubernetes 我…

智能商品系统如何协同其他系统共享数据和优化供应链决策?

智能商品系统可以通过与其他系统&#xff08;如ERP系统&#xff09;进行数据集成和协同工作&#xff0c;以实现数据共享和优化供应链决策。具体而言&#xff0c;可以采取以下方法&#xff1a; 数据接口和集成&#xff1a;智能商品系统和ERP系统可以通过数据接口进行连接和数据交…

身为程序员,你很有必要了解一下提效工具“JNPF”

如果你有软件开发的需求&#xff0c;推荐你使用以Vue为技术栈的低代码JNPF。 这款低代码和市面上的其他低代码区别很大的&#xff0c;相较于轻流、简道云、轻宜搭、微搭、帆软、活字格等等&#xff0c;这类面向业务人群使用的低代码&#xff08;不需要研发人员操作的编写的&am…

英飞凌TC3xx之一起认识GTM(九)GTM相关知识简述及应用实例(CMU,CCM,TBU,MON)

英飞凌TC3xx之一起认识GTM(九)GTM相关知识简述及应用实例(CMU,CCM,TBU,MON) 1 时钟管理单元(CMU)2 集群配置模块(CCM)3 时基单元(TBU)4 监控单元(MON)5 总结由前文的各篇内容,开发者已经知道如何使用GTM的大部分功能,在这些功能中,都需要一个信息就是fGTM 的数据…

软件测试|MySQL SHOW DATABASES详解

简介 在MySQL中&#xff0c;SHOW DATABASES是一条SQL语句&#xff0c;用于显示当前MySQL服务器上所有可用的数据库。这条简单而常用的命令可以让你快速查看服务器上的数据库列表。本文将详细介绍SHOW DATABASES的使用方法以及相关注意事项。 语法 在 MySQL 中&#xff0c;可…

vue3 img图片怎么渲染

在 Vue3 中加载图片&#xff08;img&#xff09;src地址时&#xff0c;出现无法加载问题。网上很多都建议使用 require 加载相对路径&#xff0c;如下&#xff1a; <img :src"require(../assets/img/icon.jpg)"/>但是按照这种方式加载又会报错如下&#xff1a;…

商城小程序(7.加入购物车)

目录 一、配置vuex二、创建购物车的store模块三、在商品详情页中使用store模块四、实现购加入购物车功能五、动态统计购物车中商品的总数量六、持久化存储购物车的商品七、优化商品详情页的total侦听器八、动态为tabBar页面设置数据徽标九、将设置tabBar徽标的代码抽离为mixins…

tcp/ip协议2实现的插图,数据结构6 (24 - 章)

(142) 142 二四1 TCP传输控制协议 tcpstat统计量与tcp 函数调用链 (143) 143 二四2 TCP传输控制协议 宏定义与常量值–上 (144) 144 二四3 TCP传输控制协议 宏定义与常量值–下 (145) 145 二四4 TCP传输控制协议 结构tcphdr,tcpiphdr (146) 146 二四5 TCP传输控制协议 结构 tcp…

05、Kafka ------ 各个功能的作用解释(主题和分区 详解,用命令行和图形界面创建主题和查看主题)

目录 CMAK 各个功能的作用解释&#xff08;主题&#xff09;★ 主题★ 分区★ 创建主题&#xff1a;★ 列出和查看主题 CMAK 各个功能的作用解释&#xff08;主题&#xff09; ★ 主题 Kafka 主题虽然也叫 topic&#xff0c;但它和 Pub-Sub 消息模型中 topic 主题及 AMQP 的 t…

供应链安全-镜像 Trivy kubesec

开头语 写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 内容较长&#xff0c;页面右上角目录方便跳转 Dockerfile 文件优化 减少镜像层&#xff1a;一次RUN指令形成新的一层&a…

人工智能图像生成的道德利弊

目录 一、我们应该关注人工智能图像吗&#xff1f;二、利用人工智能增强创造力的积极作用三、版权和剽窃问题四、对就业和劳动力动态的影响五、无意识的偏见和影响六、负责任地前行 人工智能&#xff08;AI&#xff09;发展迅速&#xff0c;尤其是近年来。据估计&#xff0c;超…

Flutter 监听前台和后台切换的状态

一 前后台的切换状态监听 混入 WidgetsBindingObserver 这个类&#xff0c;这里提供提供了程序状态的一些监听 二 添加监听和销毁监听 overridevoid initState() {super.initState();//2.页面初始化的时候&#xff0c;添加一个状态的监听者WidgetsBinding.instance.addObserver…

服务器宕机怎么办?怎么预防宕机?

相信不少用户会听到或者在文章中提到电脑宕机或者服务器宕机&#xff0c;不少用户对宕机的意思不太理解。那么服务器宕机是什么意思&#xff1f; 宕机属于计算机的术语&#xff0c;指电脑或者服务器不能正常工作。口语中我们简单的把停掉机器叫做down机&#xff0c;转换为汉字是…

【conda】conda 版本控制和环境迁移/安装conda加速工具mamba /conda常用指令/Anaconda配置

【conda】安装conda加速工具mamba /conda常用指令/Anaconda配置 0. conda 版本控制和环境迁移1. 安装conda加速工具mamba2. conda install version3. [Anaconda 镜像](https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/)使用帮助4. error deal 0. conda 版本控制和环境迁移…

抖去推账号矩阵+无人直播+文案引流系统开发搭建--开源

核心技术 1. AI自动直播&#xff1a; 智能系统通过丰富可定制的文案库&#xff0c; 拥有有料有趣的灵魂。不仅能自动语音讲解内容&#xff0c;还可以在直播中和用户灵活互动。直播中可将团购商品同话术自动上下架。 2. AI剪辑 可一键智能批量成片&#xff0c;也可跟着模板剪…

「PyMuPDF 专栏 」PyMuPDF创建PDF、拆分PDF

文章目录 一、本章前言二、使用PyMuPDF创建PDF文档1、实例代码2、过程详解①. 安装PyMuPDF②. 导入PyMuPDF模块③. 创建一个新的PDF文档④. 添加页面和内容⑤. 保存文档 三、使用PyMuPDF拆分PDF文档1、实例代码2、过程解析①. 导入模块②. 定义函数③. 打开源PDF文件④. 遍历页…

大数据Doris(五十二):SQL函数之数学函数

文章目录 SQL函数之数学函数 一、abs(double a)

基于Java SSM框架实现班级同学录管理系统项目【项目源码】

基于java的SSM框架实现高校校园点餐系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写&#xff0c;受到很多的追捧&#xff0c;“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架&#xff0c;通常更简单的数据源。Spring…

洁净室气流流型可视化验证试验 气流流型检测仪

了解和掌握洁净室气流流型的特点和规律是确保洁净室的性能和产品质量的重要基础。在选择气流流型时需要综合考虑各种因素&#xff0c;以达到最佳的空气净化效果。同时&#xff0c;需要定期进行气流流型的检测和验证&#xff0c;以及洁净室的清洁和维护工作&#xff0c;以确保其…