【Linux】Linux进度条小程序(包含色块实现)

我们再将Linux常用工具与命令都学会了之后,
设计进度条这个小程序可以比较好的帮助我们进行一定程度练习与巩固

目录

  • 预备知识:
    • 回车换行:
    • 缓冲区:
  • 进度条:
    • 准备工作:
    • 主题思路:
    • 代码实现:
    • 模拟实际场景:
    • 关于色块:
  • 完整代码:

预备知识:

在开始之前我们需要有两个预备知识,可以更好的辅助我们进行设计程序。

回车换行:

我们经常说的回车换行其实是两个概念

回车
代表从你现在的位置到你本行起始的位置,转义字符为'\r'
在这里插入图片描述


换行:
仅仅只是从本行的当前位置到移动到下一行。一般没有此操作的转义字符,大多数情况下都是'\n'既包括了换行与回车;
在这里插入图片描述


缓冲区:

我们先运行如下代码:

#include <stdio.h>
int main()
{printf("hello Makefile!\n");sleep(3);return 0;
}

发现终端会停止3s在出现hello Makefile!字符串,
这也就说明了缓冲区的存在在,
但是现阶段我们是很难对缓冲区有深刻理解的,
只需要知道他的存在会造成什么影响即可

缓冲区是内存中的一段空间,当程序结束或者遇到'\n'时会刷新缓冲区,
也可以选择使用fflush(stdout)进行主动刷新缓冲区

证明方法:

#include <stdio.h>
int main()
{printf("hello Makefile!");fflush(stdout);sleep(3);return 0;
}

我们在sleepfflush进行刷新即可发现结论成立


进度条:

进度条是个比较简单的小程序,有了大概得思想,实现起来细心一点是没什么大问题的。

准备工作:

此准备工作非预备工作,
这部分主要是构建makefile方便我们进行自动构建
首先还是老样子,touch上3个文件,进行声明与定义分离,还有个main文件
在这里插入图片描述
在makefile中进行配置。

在这里插入图片描述

主题思路:

每次打印时实际上都对上一次打印的数据进行覆盖,
并且每一次打印的数据都是根据当前进度进而改变进度条增加的长度。
在这里插入图片描述
我们打算搞一个如上图的进度条

代码实现:

有了预备知识作为铺垫,思想也有了,代码还是信手拈来的

注意
此时我们并不是仿真,而是先设计一个进度条框架,随后再进行仿真设计

#define length 101
#define style '-'
const char* table = "-\\|/";void ProgBar()                                                                                                                      
{char str[length] = {0};int count = 0;while(count <= 100){printf("[%-100s][%d%%][%c]\r", str, count, table[count%4]);fflush(stdout);str[count++] = style;usleep(50000);}printf("\n");
}

模拟实际场景:

也不是完全的模拟,只是我们自己设置了带宽与总大小,得到一个相对应的比例,没有将带宽设置随机

可以在Main文件中造一个模拟下载的环境,同时使用回调函数的方式进行传参

double bandwidth = 1024*1024*1.0;void download(double filesize, back_t func)
{printf("download begin filesize:%lf\n", filesize);double current = 0;while(current <= filesize){func(filesize, current);current += bandwidth;usleep(50000);}printf("\ndownload down filesize:%lf", filesize);printf("\n");
}int main()
{//博主用来测试的函数download(1024*1024*10, ProgBar);download(1024*1024*90, ProgBar);download(1024*1024*60, ProgBar);download(1024*1024*40, ProgBar);return 0;
}

将定义文件中的函数进行一些微调

#define length 101
#define style '-'
const char* table = "-\\|/";void ProgBar(double total, double current)
{char str[length] = {0};int count = 0;int len = strlen(table);double rate = (current / total)*100;while(count <= (int)rate){str[count++] = style;}printf("[%-100s][%.2lf%%][%c]\r", str, rate, table[count%len]);fflush(stdout);
}

声明文件中:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include"color.h"void ProgBar(double total, double current);
//回调函数的声明
typedef void (*back_t)(double, double);

关于色块:

关于色块博客链接,这里介绍了如何输出的用法,博主是直接粘贴过来缝缝补补直接用上了

代码实现基本逻辑是一致的,无非是变成了多次输出才形成一个完整的进度条

//version1 color
void ProgBar()
{char flag[] = {'-', '\\', '|', '/'};int len = strlen(flag);int i = 0;int j = 0;int cnt = 0;while(cnt <= 100){i = cnt;j = 100 - cnt;//这段i的while循环就是生成色块的关键,其中的reverse是宏定义while(i--){printf(REVERSE " " NONE);}while(j--){printf(" ");}printf("[%d%%][%c]\r", cnt, flag[cnt%len]);cnt++;fflush(stdout);usleep(50000);}printf("\n");
}

这是宏定义的代码(上边放的博客链接有具体的):

#define NONE                  "\e[0m"           //清除颜色,即之后的打印为正常输出,之前的不受影响
#define BLACK                 "\e[0;30m"         //深黑
#define L_BLACK             "\e[1;30m"            //亮黑,偏灰褐
#define RED                     "\e[0;31m"      //深红,暗红
#define L_RED                 "\e[1;31m"        //鲜红
#define GREEN                "\e[0;32m"         //深绿,暗绿
#define L_GREEN            "\e[1;32m"           //鲜绿
#define BROWN               "\e[0;33m"          //深黄,暗黄
#define YELLOW              "\e[1;33m"          //鲜黄
#define BLUE                    "\e[0;34m"      //深蓝,暗蓝
#define L_BLUE                "\e[1;34m"        //亮蓝,偏白灰
#define PURPLE               "\e[0;35m"         //深粉,暗粉,偏暗紫
#define L_PURPLE           "\e[1;35m"           //亮粉,偏白灰
#define CYAN                   "\e[0;36m"       //暗青色
#define L_CYAN               "\e[1;36m"         //鲜亮青色
#define GRAY                   "\e[0;37m"       //灰色
#define WHITE                  "\e[1;37m"       //白色,字体粗一点,比正常大,比bold小
#define BOLD                    "\e[1m"         //白色,粗体
#define UNDERLINE         "\e[4m"               //下划线,白色,正常大小
#define BLINK                   "\e[5m"         //闪烁,白色,正常大小
#define REVERSE            "\e[7m"              //反转,即字体背景为白色,字体为黑色
#define HIDE                     "\e[8m"        //隐藏
#define CLRLINE               "\r\e[K"          //清除行

完整代码:

ProgressBar.h:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include"color.h"
//void ProgBar();void ProgBar(double total, double current);
typedef void (*back_t)(double, double);

ProgressBar.c(有注释说明对应哪个版本):
version 1:无仿真
version 2:仿真
version 1 color:无仿真
version 2 color:仿真

#include"ProgressBar.h"#define length 101
#define style '-'
const char* table = "-\\|/";
//version 1 no color
void ProgBar()
{char str[length] = {0};int count = 0;while(count <= 100){printf("[%-100s][%d%%][%c]\r", str, count, table[count%4]);fflush(stdout);str[count++] = style;usleep(50000);}printf("\n");
}//version 2 no color
//void ProgBar(double total, double current)
//{
//    char str[length] = {0};
//    int count = 0;
//    int len = strlen(table);
//    double rate = (current / total)*100;
//
//    while(count <= (int)rate)
//    {
//        str[count++] = style;
//    }
//    printf("[%-100s][%.2lf%%][%c]\r", str, rate, table[count%len]);
//    fflush(stdout);
//}//version1 color
//void ProgBar()
//{
//    char flag[] = {'-', '\\', '|', '/'};
//    int len = strlen(flag);
//
//    int i = 0;
//    int j = 0;
//    int cnt = 0;
//    while(cnt <= 100)
//    {
//        i = cnt;
//        j = 100 - cnt;
//        while(i--)
//        {
//            printf(REVERSE " " NONE);
//        }
//        while(j--)
//        {
//            printf(" ");
//        }
//        printf("[%d%%][%c]\r", cnt, flag[cnt%len]);
//        cnt++;
//        fflush(stdout);
//        usleep(50000);
//    }
//    printf("\n");
//}//version2 color
//void ProgBar(double total, double current)
//{
//    double rate = current*100/total;
//
//    int i = 0;
//    int j = 0;
//    int cnt = (int)rate;
//
//    i = cnt;
//    j = 100 - cnt;
//    while(i--)
//    {
//        printf(REVERSE " " NONE);
//    }
//    while(j--)
//    {
//        printf(" ");
//    }
//    printf("[%.2lf%%][%c]\r", rate, table[cnt%4]);
//    fflush(stdout);
//}

Main.c:

#include"ProgressBar.h"double bandwidth = 1024*1024*1.0;void download(double filesize, back_t func)
{printf("download begin filesize:%lf\n", filesize);double current = 0;while(current <= filesize){func(filesize, current);current += bandwidth;usleep(50000);}printf("\ndownload down filesize:%lf", filesize);printf("\n");
}int main()
{download(1024*1024*10, ProgBar);download(1024*1024*90, ProgBar);download(1024*1024*60, ProgBar);download(1024*1024*40, ProgBar);//ProgBar();//ProgBar(100, 59.9);return 0;
}

color.h

#define NONE                  "\e[0m"           //清除颜色,即之后的打印为正常输出,之前的不受影响
#define BLACK                 "\e[0;30m"         //深黑
#define L_BLACK             "\e[1;30m"            //亮黑,偏灰褐
#define RED                     "\e[0;31m"      //深红,暗红
#define L_RED                 "\e[1;31m"        //鲜红
#define GREEN                "\e[0;32m"         //深绿,暗绿
#define L_GREEN            "\e[1;32m"           //鲜绿
#define BROWN               "\e[0;33m"          //深黄,暗黄
#define YELLOW              "\e[1;33m"          //鲜黄
#define BLUE                    "\e[0;34m"      //深蓝,暗蓝
#define L_BLUE                "\e[1;34m"        //亮蓝,偏白灰
#define PURPLE               "\e[0;35m"         //深粉,暗粉,偏暗紫
#define L_PURPLE           "\e[1;35m"           //亮粉,偏白灰
#define CYAN                   "\e[0;36m"       //暗青色
#define L_CYAN               "\e[1;36m"         //鲜亮青色
#define GRAY                   "\e[0;37m"       //灰色
#define WHITE                  "\e[1;37m"       //白色,字体粗一点,比正常大,比bold小
#define BOLD                    "\e[1m"         //白色,粗体
#define UNDERLINE         "\e[4m"               //下划线,白色,正常大小
#define BLINK                   "\e[5m"         //闪烁,白色,正常大小
#define REVERSE            "\e[7m"              //反转,即字体背景为白色,字体为黑色
#define HIDE                     "\e[8m"        //隐藏
#define CLRLINE               "\r\e[K"          //清除行

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

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

相关文章

图片保存后多了个水印?教你如何用华为手机保存无水印图片

对于各类生活App的深度用户来说&#xff0c;有时候碰到实用的生活技巧、攻略&#xff0c;甚至是一张好看的风景照&#xff0c;都会第一时间想要长按把图片保存到手机相册&#xff0c;有时候还会分享给朋友、朋友圈。 但是有些图片在App上显示的时候是干净的&#xff0c;保存下…

基于SQL注入漏洞的总结与归纳(个人学习 整理归纳复习

第一节 我们首先要知道什么是SQL注入漏洞 SQL注入常见的web漏洞&#xff0c;形成的主要原因是web应用程序在接收相关数据参数时未做好过滤&#xff0c;将其直接带入到数据库中查询&#xff0c;导致攻击者可以拼接执行构造的SQL语句。 像这样我们输入?id1 我们可以获得id1的信…

【QT+QGIS跨平台编译】之九:【LZ4+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、LZ4介绍二、文件下载三、文件分析四、pro文件五、编译实践一、LZ4介绍 LZ4是一种无损压缩算法,压缩速度为每核心400MB/s。 LZ4是目前效率最高的压缩算法,更加侧重于压缩/解压缩速度,压缩比并不突出,本质上就是时间换空间。 LZ4库是使用BSD许可证作为开放源码…

基于LLaMA-Factory的微调记录

文章目录 数据模型准备基于网页的简单微调基于网页的简单评测基于网页的简单聊天 LLaMA-Factory是一个非常好用的无代码微调框架&#xff0c;不管是在模型、微调方式还是参数设置上都提供了非常完备的支持&#xff0c;下面是对微调全过程的一个记录。 数据模型准备 微调时一般…

奔图P1家用激光打印机测评:小巧精致,高效便捷,开启打印新革命

在当今数字化时代&#xff0c;办公方式越来越灵活&#xff0c;日常学习也有很多作业、习题需要打印&#xff0c;无论是为了满足日常的学习、工作需求&#xff0c;还是为了追求个人兴趣、丰富业余生活&#xff0c;我们都离不开打印机的身影。打印机这个曾经被视为专业领域的设备…

每日一题——LeetCode2859.计算K置位下标对应元素的和

方法一 枚举法&#xff1a; 通过不断地将目标数值与 1 进行按位与操作&#xff0c;并根据结果判断最低位是否为 1&#xff0c;从而统计其中包含的 1 的个数。 如果1的个数等于K就加上该值。 var sumIndicesWithKSetBits function(nums, k) {function countOnes(num) {let cou…

mysql8版本批量造4000个数据SQL

需求&#xff1a; 测试工作中修改单需要构造单元下4000个组合的数据&#xff0c;写个博客来记录&#xff0c;其他类似的可以举一反三。 具体sql&#xff1a; 实现1个产品1个单元下插入4000个组合数据 思路&#xff1a; 在MySQL 8中实现循环插入4000条具有不同主键的记录&a…

老旧小区火灾频发,LoRa无线系统筑牢安全防线

近日&#xff0c;全国各地多个老旧小区火灾事故频发&#xff0c;从安微合肥南二环一老旧小区居民楼起火、上海金山区一小区居民楼火灾&#xff0c;到1月24日江西新余市特大火灾......都造成了不同程度的人员伤亡和财产损失&#xff0c;令人扼腕痛惜&#xff0c;教训十分深刻。 …

蓝牙----蓝牙协议栈Host层

蓝牙协议栈----Host层 蓝牙物理层基本信息链路层的状态机进入连接态的步骤主动扫描与被动扫描链路层通信模式 蓝牙地址蓝牙设备地址蓝牙标识地址蓝牙接入地址 蓝牙广播信道管理蓝牙数据信道跳频 蓝牙协议栈Host层包括PHY、LL、HCL层&#xff0c;注重关注PHY物理层和LL链路层。 …

电脑监控系统:企业网络安全解决方案

在当今数字化的世界里&#xff0c;企业的网络安全已经成为一项至关重要的任务。电脑监控系统作为一种有效的解决方案&#xff0c;正在被越来越多的企业所采用。 电脑监控系统是一种集成了多种安全功能的综合性解决方案&#xff0c;旨在为企业提供全面的网络安全防护。该系统能够…

JavaWeb01--Tomcat

1、JavaWeb概述 Web开发是基于请求和响应的&#xff1a; 请求&#xff1a;浏览器&#xff08;客户端&#xff09;向服务器发送信息 响应&#xff1a;服务器向浏览器回送信息 请求和响应是成对出现的。 Web资源分类 所谓Web资源即放在Internet网上供外界访问的文件或程序&#x…

31、WEB攻防——通用漏洞文件上传JS验证mimeuser.ini语言特性

文章目录 文件上传一、前端验证二、.user.ini 文件上传 检测层面&#xff1a;前端、后端等检测内容&#xff1a;文件头、完整性、二次渲染等检测后缀&#xff1a;黑名单、白名单、MIME检测等绕过技巧&#xff1a;多后缀解析&#xff08;php5、php7&#xff09;、截断、中间件特…

代码随想录算法训练营第十四天|二叉树基础-二叉树迭代-二叉树

文章目录 二叉树基础二叉树种类满二叉树完全二叉树二叉搜索树平衡二叉搜索树 二叉树的存储方式链式存储顺序存储 二叉树的遍历方式二叉树的定义 二叉树的递归遍历144.二叉树的前序遍历代码&#xff1a; 145.二叉树的后序遍历代码&#xff1a; 94. 二叉树的中序遍历代码 二叉树的…

「阿里云」幻兽帕鲁个人服务器已上线,3分钟快速搭建

基于阿里云搭建幻兽帕鲁服务器方法&#xff0c;1到2分钟部署完成&#xff0c;稳定运行无卡顿&#xff0c;阿里云服务器网aliyunfuwuqi.com分享保姆级手把手教程&#xff0c;基于阿里云计算巢、云服务器或无影云桌面都可以&#xff1a; 基于阿里云幻兽帕鲁服务器创建教程 基于…

EasyExcel实现导出图片到excel

pom依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.1.0</version> </dependency> 实体类&#xff1a; package com.aicut.monitor.vo;import com.aicut.monit…

CSDN年度报告图片卡通小人收集

摘要&#xff1a;CSDN推出的年度报告真的太赞了&#xff0c;还定制了诸如“情感的编织者”“敏锐的激励者”“灵感的捕捉者”“组织的表达者”“洞悉的指挥家”“心灵的领航员”“生动的记录者”“温暖的叙述者”“理性的探索者”等等精准且浪漫的标签&#xff0c;加上非常有灵…

基于Java SSM框架实现在线考试系统项目【项目源码+论文说明】

基于java的SSM框架实现在线考试系统演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#…

modelscope下载模型

# 私有模型下载&#xff0c;前提是您有响应模型权限 方法1 git lfs install git clone http://oauth2:your_git_tokenwww.modelscope.cn/<namespace>/<model-name>.git 如何获取git token 用您的账号登录https://www.modelscope.cn &#xff0c;在个人中心->访…

正确看待华为鸿蒙……是盲目跟风吗?

先要了解纯血鸿蒙是什么&#xff1f;与之前的套壳Android版本区别在哪&#xff1f;了解这核心东西之后才会真正的看出“纯血鸿蒙”的未来与发展。 纯血鸿蒙全栈自研 HarmonyOS NEXT系统底座全线自研&#xff0c;去掉了传统的Linux内核以及AOSP等代码&#xff0c;仅支持鸿蒙内…

3分钟搭建幻兽帕鲁私服,无需任何命令代码,点点鼠标一键部署

想玩《幻兽帕鲁》和朋友们一起乐呵呵&#xff1f;这个指南教你怎么在阿里云上弄个游戏服务器&#xff0c;超简单。点几下鼠标&#xff0c;2、3分钟就搞定&#xff0c;不用头疼设置那些复杂的东西。一键部署幻兽帕鲁私服&#xff0c;告诉你私服怎么搭建 本次利用阿里云服务器的…