Linux--好玩的进度条

news2024/10/7 2:19:32

前言

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

 一、创建文件及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.c
  2     gcc $^ -o $@
  3 .PHONY:clean
  4 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.coloradmin.cn/o/1368481.html

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

相关文章

钡铼技术推出注塑机OPC UA网关,助力注塑机行业转型升级

前言 “工欲善其事&#xff0c;必先利其器”&#xff0c;塑料行业也是一样&#xff0c;注塑机就是塑料行业最重要的“器”之一。 “ OPC UA 如果你的注塑应用支持OPC UA无疑会有广泛的适配性。 OPC UA作为工业4.0中一个重要的通信协议&#xff08;IEC 62541&#xff09;&am…

MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 当谈论MySQL高可用性解决方案时&#xff0c;从…

密码学(三)

文章目录 前言一、Software Attestation Overview二、Authenticated Key Agreement三、The Role of Software Measurement 前言 本文来自 Intel SGX Explained 请参考&#xff1a; 密码学&#xff08;一&#xff09; 密码学&#xff08;二&#xff09; 一、Software Attesta…

kubernetes Adminssion Webhook 准入控制器 (ImagePolicyWebhook)

开头语 写在前面&#xff1a;如有问题&#xff0c;以你为准&#xff0c; 目前24年应届生&#xff0c;各位大佬轻喷&#xff0c;部分资料与图片来自网络 介绍 原理 流程 Admission Webhook 准入控制器Vebhook是准入控制插件的一种&#xff0c;用于拦截所有向APISERVER发送的…

企业提升客户体验的实用技巧与策略

什么是客户体验&#xff1f;通俗点说&#xff0c;他是客户和企业在互动过程中收获的感受和印象。这个过程包括接触、预购、购买、使用、售后整个阶段。 联想到我们自己购买产品的过程&#xff0c;对一家店或者品牌的感受&#xff0c;绝不仅仅从产品的功能体验感和质量上获得的…

如何在Android Glide中结合使用CenterCrop和自定义圆角变换(图片部分圆角矩形)

如何在Android Glide中结合使用CenterCrop和自定义圆角变换&#xff08;图片部分圆角矩形&#xff09; 在Android开发中&#xff0c;使用Glide加载图片时&#xff0c;我们经常需要对图片进行特定的处理&#xff0c;比如裁剪和圆角变换&#xff0c;特别是一些设计稿&#xff0c;…

【51单片机】点亮第一个LED灯(含创建文件等基础操作)

51单片机现在不仅是电子信息专业学生的必修课&#xff0c;也是进入嵌入式领域的踏脚石。 本系列将会按照江科大的视频进行&#xff0c;也算是相当于一个笔记&#xff0c;进行巩固 实现第一个LED灯的点亮其实并不复杂&#xff0c;重要的是有一些准备工作比较繁琐&#xff0c;就…

关于“Python”的核心知识点整理大全63

目录 20.2.11 使用 Git 跟踪项目文件 1. 安装Git 2. 配置Git 3. 忽略文件 .gitignore 注意 4. 提交项目 20.2.12 推送到 Heroku 注意 20.2.13 在 Heroku 上建立数据库 20.2.14 改进 Heroku 部署 1. 在Heroku上创建超级用户 注意 注意 20.2.11 使用 Git 跟踪项目文件…

两种方式实现mysql截取年月日

select date_format(now(), %Y-%m-%d) select substring(now(), 1, 10)

MySQL面试题(下)

一.面试题案例 二.思维导图 一.面试题案例 1.查询学过「张三」老师授课的同学的信息 select s.*,c.cname,t.tname,sc.score from t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc where t.tidc.cid and c.cidsc.cid and sc.sids.sid and t.tnam…

使用 TypeVar 创建 Self 类型变量,方便用户在 Pycharm 编辑器中链式调用校验方法

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 使用 Raise…

linux centos 账户管理命令

在CentOS或其他基于Linux的系统上&#xff0c;账户管理涉及到用户的创建、修改、删除以及密码的管理等任务。 linux Centos账户管理命令 1 创建用户&#xff1a; useradd username 这将创建一个新用户&#xff0c;但默认不会创建家目录。如果想要创建家目录&#xff0c;可以…

Mac电脑好用的修图软件:Affinity Photo 2中文 for Mac

Affinity Photo 2提供了广泛的图像编辑和调整工具&#xff0c;使用户能够对照片进行精确的编辑和改进。它支持图像裁剪、旋转、缩放、变形等操作&#xff0c;以及曝光、色彩、对比度、饱和度等调整。 非破坏性编辑&#xff1a;软件采用非破坏性编辑方式&#xff0c;即对原始图…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-2(1) 质量刚体的在坐标系下运动

本文仅供学习使用&#xff0c;总结很多本现有讲述运动学或动力学书籍后的总结&#xff0c;从矢量的角度进行分析&#xff0c;方法比较传统&#xff0c;但更易理解&#xff0c;并且现有的看似抽象方法&#xff0c;两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

【高效开发工具系列】idea注释设置

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【idea】idea 开发快捷键

在Java开发中&#xff0c;有一些常用的快捷键和工具&#xff0c;可以提高开发效率。以下是一些常见的Java开发常用到的功能和快捷键&#xff1a; IDE快捷键&#xff1a; 代码大小写切换&#xff1a; ctrlshiftu 格式化代码&#xff1a;Ctrl Alt L&#xff0c;会让代码更整…

GC9118S—低压 5V 全桥驱动芯片,可替代TMI8118,应用于摄像机,机器人技术等产品上

GC9118S 是一款低压 5V 全桥驱动芯片&#xff0c;为摄像机、消费类产品、玩具和其他低压或者电池供电的运动控制类应用提供了集成的电机驱动解决方案。 GC9118S 能提供高达 1.1A 的持续输出电流。可以工作在 2~6V 的电源电压上。具有 PWM&#xff08;IN/IN&#xff09;输入接口…

UE5 C++(十四)— Interface的使用

文章目录 接口&#xff08;Interface&#xff09;介绍接口在C中的应用接口在UE中的使用 接口&#xff08;Interface&#xff09;介绍 接口是一系列抽象方法的声明&#xff0c;是一些方法特征的集合&#xff0c;这些方法都应该是抽象的&#xff0c;需要由具体的类去实现&#x…

Linux进程通信之管道

目录 1、无名管道 1.无名管道的特点 2.pipe函数创建管道 3.图例 2、命名管道&#xff08;FIFO&#xff09; 1.命名管道的特点 2.mkfifo 函数-创建命名管道 3.示例 1.循环读取数据 2.循环写入数据 1、无名管道 管道通常指的就是无名管道&#xff0c; 1.无名管道的特点…

Support Vector Machine 建模(基于三种数据集)

目录 一、 SVM 对于 Iris 数据集的处理 建模&#xff1a; 二、 SVM 对于 弯月数据集的处理 建模&#xff1a; 三、 SVM 对于 direct marketing campaigns (phone calls)数据集的处理 建模&#xff1a; Support Vector Machine (SVM)是一种机器学习算法&#xff0c;属于监…