Linux:进度条的创建

 

 

目录

使用工具的简单介绍: 

\r  :

fflush  :

倒计时的创建:

倒计时的工作原理:

 进度条的创建:

 不同场景下、打印任意长度的进度条:

main .c  

procbor.c 

测试效果:

使用工具的简单介绍: 

在创建进度条之前,首先要明白两个工具,fflush 和  \r 

\r  :

熟悉键盘以及经常使用键盘的小伙伴应该知道,现在的键盘上的enter 回车键 和早之前的回车键样式是不一样的,如下图所示:

而且,还有一个大家并不是非常熟悉的知识,回车键的功能其实是两个,一个是换行,一个是回车。

所谓换行就是将光标从这一行变到下一行中,且是垂直下落,除此之外光标位置不会有其他的移动。

而回车就是回到当前行的最前端最开头位置。

在Linux系统中,换行和回车是并不是像键盘上的回车键一样合在一起使用,而是分别由两个命令控制着。  

\r,就是Linux中的回车,在Linux的文件文本中的作用是将光标移动到当前行的开头位置,即回车。它通常与\n(换行符)一起使用,表示换行并回到行首。

fflush  :

fflush函数的作用是刷新缓冲区,将缓冲区中的数据立即写入到文件中。它可以用来确保数据被及时写入文件,而不是等到缓冲区满或程序结束时才写入。

在Linux中,通常使用fflush(stdout) 将缓冲区的数据冲刷到显示器上,让数据显现。

倒计时的创建:

倒计时的工作原理:

倒计时指的是在一个位置上的数字随着光标的不断闪烁而不断的更新减小,直到为0。

在如果要在Linux上实现倒计时,除了上述的两个工具外还需要额外了一个工具,sleep  休眠命令,休眠命令可以解决倒计时数字的停顿的问题。

在Linux实现的原理则

  • 利用缓冲区实现一个简单的倒计时,使用\r返回光标位置并清除缓冲区数据,但是使用fflush将缓冲区的数据提取到了显示器文件中。
  • 单单只有\r是不行的,因为\r虽然把光标的位置进行了返回(输入一个数字光标会移动到下一个位置,但是\r会在移动下一个位置后会返回回去),但是会将数字从缓冲区中删除清空,导致在显示器中显示不出来,所以需要fflush进行提取 

 进度条的创建:

一个进度条最基本的要求是要有进度读条,要有显示进度读条占总数据占比的百分比数字,要有旋转的表示进度正在进行中的光标图案。

在Linux中,可以使用 #  =  等符号表示进度读条,而根据之前倒计时的操作,我们直到需要定义一块区域作为缓冲区,随后不断地更新和刷新缓冲区内部的数据,将其数据显示到显示屏上依次达到进度条不断地在更新进度,不断地在增长的效果。

同时,为了表示进度条不断地在增长,因此需要使用循环函数在缓冲区中不断地添加#来显示进度条的增长。

对于百分比数据,可以利用定义好的缓冲区大小来通过计算得到,在上图中,定义的百分比大小是101,其中的1表示的是最初始的数据,也就是 \0 来表达进度是0 ,所以只要按照#的个数来计算百分比的占比是多少。

同时为了保证进度条是一个不会因为进度的增长而不断变长,而是有一个固定长度的,所以使用%-100实现距离的扩充以及往右边增长进度的效果。 

而百分比的数据则需要打印除#号的个数以及加上%即可完成,注意%符号在文件中需要两个%才能在显示屏上显示出来。

最后,光标的添加,可以将光标的图案进行展开,然后利用\r的特性和#号个数的和光标的展开后的字符数进行计算,计算出每一个#的光标的图案,同时需要注意的是\符号需要两个\才能打印出来!

 不同场景下、打印任意长度的进度条:

因为进度条是不会单独出现的,进度条要配合具体的场景使用,所以在此处我们建立一个文件下载进度的进度条。 

main .c  

拥有下载场景的进度条,进行下载文件:

下载文件的大小:filesize  =  100兆b  = 100 * 1024 * 1024 * 1.0

下载场景 download  

当前累计下载的数据量 current = 0.0 初始

只要下载量小于文件大小就要一直下载 while (current < = filesize)

网速下载带宽 /下载速度: bandwidth =  1024 * 1024 *1.0   本来不是1.0的因为网速的下载速度是随机的但这里为了方便就不弄了  1024 *1024 表示一兆

下载的本质是当前的下载量加上下载速度给予的下载量,所以就构成了current + = bandwidth

同时我们的下载可能是在网络上进行的,会有些网络的卡顿,于是要加上sleep表示网络波动的效果

procbor.c 

下载文件场景下的进度条本质上是给予任意数字打印任意长度进度条,所以这里传输的参数total表示的是文件的下载大小,而current表达的是文件的当前下载量。

代码和之前的进度条代码并未有太大的变化,唯一的变化是#的多少和数据的占比取决于当前下载量和文件大小之间的关系运算。

下载量*100 / 文件大小  得出 占比

例如 下载量是 2 文件大小是100  2/100 = 0.2   2*100/100 = 2  表示两个 # 

两个#同时表示2%

测试效果:

 


 

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

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

相关文章

YOLOv8实例分割实战:TensorRT加速部署

课程链接&#xff1a;https://edu.csdn.net/course/detail/39273 PyTorch版的YOLOv8支持高性能实时实例分割方法。 TensorRT是针对英伟达GPU的加速工具。 本课程讲述如何使用TensorRT对YOLOv8实例分割进行加速和部署&#xff0c;实测推理速度提高3倍以上。  采用改进后的t…

设计模式第2篇|策略模式

&#x1f680; 作者简介&#xff1a;程序员小豪&#xff0c;全栈工程师&#xff0c;热爱编程&#xff0c;曾就职于蔚来、腾讯&#xff0c;现就职于某互联网大厂&#xff0c;技术栈&#xff1a;Vue、React、Python、Java &#x1f388; 本文收录于小豪的前端系列专栏&#xff0c…

「连载」边缘计算(十)01-29:边缘部分源码(源码分析篇)

&#xff08;接上篇&#xff09; 组件中模块的共用框架和功能分析 KubeEdge组件中各个功能模块之间是通过Beehive来组织和管理的。Beehive是一个基于go-channels的消息框架。但本文的重点不是Beehive&#xff0c;所以只会分析KubeEdge中用到的Beehive的相关功能。下面深入Clo…

Vertica单点更改服务器ip

需求 服务器网段调整&#xff0c;将ip&#xff1a;192.168.40.190收回&#xff0c;使用ip&#xff1a;192.168.40.200 默认情况下&#xff0c;节点 IP 地址和导出 IP 地址配置相同的 IP 地址。导出地址是网络上有权访问其他 DBMS 系统的节点的 IP 地址。使用导出地址从 DBMS …

解锁Web3:数字未来的大门

随着科技的不断推进&#xff0c;我们正站在数字时代的新门槛上。Web3&#xff0c;作为互联网的下一个演进阶段&#xff0c;正在逐渐揭开数字未来的面纱。本文将深入探讨Web3的本质、对社会的影响以及在数字时代中所扮演的关键角色。 什么是Web3&#xff1f; Web3是互联网发展的…

vs2008配置mysql

1.在官网下载C库&#xff1a;MySQL Connector C 1.0.5 2.在官网下载C库&#xff1a;mysql-connector-c-noinstall-6.0.2-win32 3.vs2008中工程配置 4.拷贝dll到程序运行目录

DFS专题(dfs求连通块)P1451 求细胞数量——洛谷(题解)

题目描述 一矩形阵列由数字 00 到 99 组成&#xff0c;数字 11 到 99 代表细胞&#xff0c;细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞&#xff0c;求给定矩形阵列的细胞个数。 输入格式 第一行两个整数代表矩阵大小 &#xfffd;n 和 &#xfffd;m。 接下…

从源码到成功经营:连锁餐饮管理系统的开发实践

连锁餐饮业更是需要精密的系统来统一管理多个分店的运营&#xff0c;提高效益并确保一致的服务标准。所以&#xff0c;本篇文章小编将为大家讲述如何开发连锁餐饮管理系统&#xff0c;希望对您有一定的启发。 一、系统设计与架构 首先&#xff0c;成功的连锁餐饮管理系统源码需…

高等数学:导数

本文主要参考视频如下&#xff1a; 【建议收藏】同济七版《高等数学》精讲视频 | 期末考试 | 考研零基础 | 高数小白_哔哩哔哩_bilibili 仅供本人学习使用。 之前主要学习了三个概念&#xff1a; 极限&#xff1b; 无穷小&#xff1b; 连续&#xff1b; 先简单捋一捋。 极限是说…

IDEA:git 回滚本地提交-git 选择 Reset Current Branch to

前言 回滚提交到本地但是还没有 Push 上去的提交 选择我们要回滚的节点&#xff0c;然后点击 git 选择 Reset Current Branch to… 再选择 Hard 。当我们点击 Reset 的时候&#xff0c;代码就会回滚到单前选中的这个版本

C++求素数

C continue语句求100-200之间的素数 #include <iostream>int main() {for (int num 100; num < 200; num) {bool isPrime true;for (int i 2; i < num / 2; i) {if (num % i 0) {isPrime false;break; // 跳出当前循环}}if (isPrime) {std::cout << nu…

「优选算法刷题」:只出现一次的数字Ⅲ

一、题目 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 示例 1&#xff1a; …

计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )

文章目录 为什么要数据交换&#xff1f;总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…

密码加密——MD5与BCryptPasswordEncoder

目录 一、问题 二、密码加密 1、MD5密码加密 2、BCryptPasswordEncoder加密&#xff08;推荐&#xff09; 2.1 特点 2.2 使用步骤 一、问题 在数据库表中的密码都是明文存储的&#xff0c;安全性太低 需求&#xff1a; 将密码加密后存储&#xff0c;提高安全性 二、密码加密…

探析零知识证明高能发展路径:走向更安全、私密且可扩展的 Web3 新时代

原文&#xff1a;https://www.coinbase.com/blog/understanding-the-zero-knowledge-landscape 作者&#xff1a;Jonathan King&#xff5c;Coinbase Ventures 编译&#xff1a;TinTinLand 本文核心观点 2023 年&#xff0c;零知识技术吸引了逾 4 亿美元的投资&#xff0c;主…

正则表达式补充以及sed awk

正则表达式&#xff1a; 下划线算 在单词里面 解释一下过程&#xff1a; 在第二行hello world当中&#xff0c;hello中的h 与后面第一个h相匹配&#xff0c;所以hello中的ello可以和abcde匹配 在world中&#xff0c;w先匹配h匹配不上&#xff0c;则在看0&#xff0c;r&#…

三、ElasticSearch集群搭建实战

本篇ES集群搭建主要是在Linux VM上&#xff0c;未使用Docker方式, ES版本为7.10 ,选择7.10版本原因可以看往期文章介绍。 一、ElasticSearch集群搭建须知 JVM设置 Elasticsearch是基于Java运行的&#xff0c;es7.10可以使用jdk1.8 ~ jdk11之间的版本&#xff0c;更高版本还没…

防御保护 笔记整理

一、ASPF--- 针对应用层的包过滤 ASPF --- 针对应用层的包过滤 --- 用来抓取多通道协议中协商端口的关键数据包&#xff0c;之后&#xff0c;将端 口算出&#xff0c;将结果记录在sever-map表中&#xff0c;相当于开辟了一条隐形的通道。 FTP --- 文件传输协议 FTP协议是一个典…

Android imageView.setImageXXX() 引发的卡顿问题

在 Android 开发中&#xff0c;ImageView 是一个用户界面控件&#xff0c;用于在应用中显示图片。它是 Android UI 组件库中一个非常基础和常用的部分。使用 ImageView&#xff0c;你可以在屏幕上显示来自不同来源的图像&#xff0c;比如位图文件、绘图资源 drawable、网络来源…

NPDP认证:产品经理的国际专业认证

你是否想证明自己在产品开发与管理方面的专业能力&#xff1f;NPDP认证正是你需要的&#xff01;&#x1f525; NPDP认证&#xff0c;即产品经理国际资格认证&#xff0c;由美国产品开发与管理协会&#xff08;PDMA&#xff09;所发起&#xff0c;是全球公认的新产品开发专业认…