【Linux】-第一个小程序(进度条)

news2024/11/25 6:11:13

💖作者:小树苗渴望变成参天大树
🎉作者宣言:认真写好每一篇博客
🎊作者gitee:gitee
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法
在这里插入图片描述

如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

文章目录

  • 前言
  • 一、知识铺垫
    • 1.1回车换行
    • 1.2行缓冲区
    • 1.3倒计时
  • 二、进度条
    • 2.1基础进度条
    • 2.2进阶进度条
  • 三、总结


前言

大家好久不见,已经快一个月没有更新Linux相关的知识了,希望大家还没有忘记前面学过的知识,不记得可以看看我前面写的博客,可以快速帮大家进行回忆,今天我们讲讲一个新的知识,把我们前面说到的make进行联系起来,再讲小程序进度条之前,我还有两个知识铺垫,不然大家不好理解,话不多说,我们开始进入正文


一、知识铺垫

再讲解进度条之前,我们必须了解这两个概念,一个是回车换行,一个是行缓冲区

1.1回车换行

对于回车换行其实是两个概念,一个是回车,一个是换行,换行是光标换到下一行,并不会到文本的开头,回车使光标回到当前行的开始,那在我们语言的层面是怎么做到对文本进行换行和回车的,我们平时说到 \n其实就是换行的意思的,但是语言的本身把他解释成回车换行,\r是回车的意思的,回车换行其实就是先换行再进行回车,我们来看看老式的键盘
加粗样式
这个标志就很形象,为什么要讲解这个知识点,原因是为了更好的引出下面这个要铺垫的知识点

1.2行缓冲区

再我们的C语言中,我们要行缓冲区,这是个什么,为什么要有这个,再我们运行程序的时候,我们会在屏幕上看到显示的内容,这些都是由字符组成的,那我们的C语言不是一个字符一个字符的显示再屏幕上,这样觉得消耗太大了,所以我们有了行缓冲区的概念,就是程序运行时的一块内存,把数据先放到这个内存里面,等到这个小内存满了,就直接一起全部给刷新出来,为什么又叫行缓冲区,就是当一行满了,就一起刷新出来,只有遇到\n或者scanf或者fflush这样的函数就会提前进行刷新,程序结束后,最终也会将数据进行刷新出来。

所以我们来看一个例子:

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

在这里插入图片描述
再来看这个代码:

#include <stdio.h>
#include<unistd.h>
int main()
{
 printf("hello Makefile!");//1
 sleep(3);//2
 return 0;
}

在这里插入图片描述
大家看到这个结果大概率会认为先执行了2代码,再执行1代码,但是事实却不是这个样子的,我们C语言的代码都是自上往下进行执行的,除非遇到跳转,循环之类的,对于上面的代码的肯定是先执行的打印函数,再执行休眠函数,那为什么不是先打印出来呢??原因就是,打印的数据再缓冲区里面,然后开始执行了2代码,最后程序结束了,就会一起刷新出来,最后从显示出来。

我们想必须提前刷新出来,还有一种方法就是使用fflush函数,我们查看一下手册在这里插入图片描述
再我们c语言会默认打开三个流,这个再C语言专栏的文件操作讲过,一个是输入流stdin,一个是输出流stdout,一个是错误流stderr,而fflush的参数就是传流进出,这里是将数据输出,所以使用输出流

代码修改:

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

在这里插入图片描述
大家看到达到我们想要的效果了吧。

1.3倒计时

结合上面讲的两个知识点,进行编写一个倒计时。

  1 #include"processBar.h"
  2 int main()
  3 
  4 {
  5     int cnt=9;
  6     while(cnt>=0)
  7     {
  8         printf("%d",cnt);
  9         fflush(stdout); //不加会显示不出来,最后会一起显示出来                                                                                                                                               
 10         sleep(1);
 11         cnt--;
 12     }
 13     return 0;
 14 }

不加:
在这里插入图片描述
加:
在这里插入图片描述

显然这两种都不是我们想要的倒计时,我们看看有一个特点,我们每输出一个时间光标就往后面跑一个字符,所以想要把之前的字符覆盖,就要是光标一直再开头的位置,所以我们再打印的时候加一个 \r

+\r
在这里插入图片描述
这才是我们想要的倒计时,但是这个程序还有一个小毛病,但从大于9开始倒计时就会出现问题,我们需要进行打印格式的调整

会出现下面的情况:

在这里插入图片描述
解决方法:(以%-2d的形式进行打印就可以了)
在这里插入图片描述

到这里我们的知识铺垫到此结束,接下来开始正式讲解进度条的实现

二、进度条

我们最终是要将我们的进度条模拟实现成多软件一起下载的场景,如下:
在这里插入图片描述

此次进度条的模拟实现,我打算使用多文件的方式,使用自动化构建来编写,我们开始做一些前期工作在这里插入图片描述
我们准备工作做好之后,我们开始来实现进度条代码吧

2.1基础进度条

设计思想: 在实现对多软件的模拟进度条下载,我们必须先弄清楚一个普通的进度条是怎么实现的吧。我们就需要使用到\r的特性,\r是回车的意思,将光标回到当前行开始的地方,我们采取的是先打印一个字符,然后再增加一个字符进行覆盖打印,如果是换行打印,就类似于一个直角三角形,我们来看代码实例:

  1. 错误示范
    在这里插入图片描述
    这个显然不是我们想要的效果,我们达到我们想要的推进式打印,但是想要打印在同一行,这时候就需要使用\r使光标变到第一行,然后一次一次的覆盖打印,但是要记得刷新。

  2. 正确操作
    在这里插入图片描述
    这个就符合我们想要的进度条了,但是这个进度条和我们一开始想要的还是有差别

  3. 将进度条放在一个框框里面,并且显示进度,这个需要了解C语言的打印格式,C语言默认是右对齐,我们想要每次打印从左往右,就需要采取左对齐,再框框里面预留100个位置,因为一次是增加一个字符,我们来看代码:
    在这里插入图片描述

  4. 等待旋转标志
    这个是告诉用户进度条再运行,给个提示,使用字符 **|/-\**循环打印来模拟实现再旋转的场景,看代码:
    在这里插入图片描述
    我们的第一代进度条就算是完成了,我们再来完善一下,使他变得可控一些
    在这里插入图片描述
    代码:

  1 #include"processbar.h"
  2 void processbar()
  3 {
  4     char bar[NUM]={0};
  5     int cnt=0;
  6     const char*label="|/-\\";
  7     int len=strlen(label);
  8     while(cnt<=100)
  9     {
 10         printf("[%-100s][%d%%][%c]\r",bar,cnt,label[cnt%len]);
 11         fflush(stdout);
 12         usleep(50000);//控制进度条的时间                                                                                                                               
 13         bar[cnt++]=STYLE;
 14     }
 15     printf("\n");
 16 }

2.2进阶进度条

我们要是想完成这个进阶进度条,就不能把循环放进一个函数里面,这样是不可控的,我们要专门写一个下载函数,来进行软件的下载,把下载的进度单独设置成一个函数,什么叫下载的进度,下面这就叫下载的进度

在这里插入图片描述
我们来修改代码:

 1 #include"processbar.h"
  2 
  3 //下载函数
  4 void download(int tatol,int internetspeep)//传软件总大小和下载速度
  5 {
  6     initbar();
  7     int cur=0;//从0MB开始下载
  8     while(cur<=tatol)
  9     {
 10         processbar(cur*100/tatol,tatol,internetspeep);//乘100是因为传进去里面有百分比,传当前进度,总大小和下载速度
 11         cur+=internetspeep;//internetspeepMB/s的速度下载
 12         usleep(1000000);
 13     }
 14     printf("\n");
 15 }
 16 //进度函数
 17 char bar[NUM]={0};//设置成全局的,因为再下载函数里面要频繁调用进度函数,而进度是一直推进的,放在进度函数里面会导致调用依次之后就会被销毁
 18 void initbar()//每次任务下载的之前都要初始化一下
 19 {
 20     memset(bar,'\0',sizeof(bar));
 21 }
 22 void processbar(int rate,int tatol,int internetspeep)//传当前进度进来,就是已经下载的大小占总大小的多少
 23 {
 24     const char*label="|/-\\";
 25     int len=strlen(label);                                                                                                                                             
 26     printf("[%-100s][%d%%][%c][%s%d%s]\r",bar,rate,label[rate%len],"已经下载了",tatol*rate/100,"MB");
 27     fflush(stdout);
 28     int count=internetspeep*100/tatol;
 29     while(count--)//每次进度条增加几条字符,按照下载速度占总大小的百分比老算
 30     {
 31        bar[rate++]=STYLE;
 32     }
 33 }

在这里插入图片描述
我们来看运行结果:
在这里插入图片描述


这样已经很符合我们平时下载的进度条了,但是我还想再优化一下时进度条好看一些---------->这样的形式
代码优化:在这里插入图片描述

在这里插入图片描述
颜色优化:(https://blog.csdn.net/wuquan_1230/article/details/106077560)参考这篇博客
代码:
在这里插入图片描述

在这里插入图片描述
这就实现了一个非常好看的进度条

三、总结

今天大家实现了Linux上的第一个小程序,进度条,希望大家下来可以自己去实现一下,还是比较好玩的,也可以修改成自己风格的进度条,我们今天的知识就讲解到这里了,下篇再见

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

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

相关文章

Activiti modoler 整合后报错 TypeError: Cannot read property ‘namespace‘ of undefined

之前在Demo整合过没问题&#xff0c;结果好不容易整合到现在的项目&#xff0c;结果出现成这个鬼样子……问题找了好久&#xff0c;一直以为是SpringSecurity请求限制没放开&#xff0c;所以找SpringSecurity的debug日志&#xff0c;浏览器请求有没有404、500、502等&#xff0…

将OpenAI和ChatGPT模型与LearnDash线上学习平台结合使用

人工智能革命来了&#xff01;&#xff08;以尽可能最好的方式。&#xff09;了解如何使用 Uncanny Automator 通过 OpenAI 和 ChatGPT 模型为您的线上学习和LearnDash LMS提供动力。 当人们听到“人工智能”这个词时&#xff0c;他们往往会想到流氓机器人、无政府状态的机器人…

科技项目验收测试报告包括哪些内容?

科技项目验收测试报告是评估科技项目质量和可靠性的重要文件。通过全面的测试和评估&#xff0c;可以确保项目的质量&#xff0c;提高用户满意度&#xff0c;降低项目风险。 一、科技项目验收测试报告的内容 1. 项目概述&#xff1a;介绍项目的背景、目标和范围&#xff0c;…

从 AI 增强到大模型,企业使用数据的方式又将如何变化?

AI&#xff08;Artificial Intelligence&#xff0c;人工智能&#xff09;的发展不过百年&#xff0c;却已经深刻影响着人们的思维和见解&#xff0c;并逐渐关联到每个人生活和工作的方方面面。从最初的规则引擎和引入统计学方法&#xff0c;到基于知识表示和推理机制的专家系统…

瓴羊QuickBI数据门户帮助企业高效管理和展示数据,使其更加明确易懂

随着信息技术时代的到来&#xff0c;越来越多的企业意识到商业信息是其最宝贵的资产之一。对于获取商业信息&#xff0c;需要专业的数据分析。因此&#xff0c;商业智能BI工具&#xff0c;如瓴羊QuickBI已经成为企业信息化中必不可少的工具。它拥有卓越的数据管理和展示功能&am…

VS2019中WebService实现发布、调用以及问题汇总

VS2019中WebService实现发布、调用以及问题汇总 前言一、WebService是什么&#xff0c;意义有哪些&#xff1f;二、创建二.发布三.访问问题总结1.不是专用连接2.HTTP错误 403.14 - Forbidden3.HTTP 错误 404.3 - Not Found4.应用程序种服务器错误 前言 在对接工厂Mes的过程中&…

图书馆流量监控性能分析案例

前言 图书馆信息中心老师反应&#xff0c;用户反馈系统有访问慢的情况&#xff0c;需要通过流量分析系统来了解图书馆系统的运行情况&#xff0c;此报告专门针对图书馆系统的性能数据做了分析。 图书馆已部署NetInside流量分析系统&#xff0c;使用流量分析系统提供实时和历史…

springboot 整合mybatis plus,使用druid 切换多数据源实现单数据库事务,附赠项目源码地址

项目源码地址 GitHub - liyanlei58/ssm: springboot druid mybatis plus 事务 最近想搭一套spring cloud开发环境&#xff0c;各种不顺利吧&#xff0c;先是spring cloud的组件某些功能不好用&#xff0c;是版本自身的bug。后来又碰到了事务无法回滚&#xff0c;这个搞了好几个…

银河麒麟服务器v10 sp1 安装mysql

可以先用 dpkg --list|grep mysql 查看自己的mysql有哪些依赖&#xff1a; 上图已经是安装后的截图&#xff0c;然后再卸载 sudo apt-get autoremove --purge mysql-common 本文在没有安装之前&#xff0c;只有mysql-common包&#xff0c;再用dpkg --list|grep mysql查看&…

[MySQL]在搭载Linux系统(centos7)的云服务上安装MySQL

[MySQL]MySQL 在 Centos 7环境安装 安装与卸载中&#xff0c;用户全部切换成为root&#xff0c;⼀旦安装&#xff0c;普通用户也能够使用。 文章目录 [MySQL]MySQL 在 Centos 7环境安装1. 卸载不要的环境2. 获取MySQL官方yum源3. 安装mysql yum 源&#xff0c;对比前后yum源4.…

Windows server 下关闭135/139/445端口

一、关闭​ ​135端口​​ 方案一 第一步 运行dcomcnfg&#xff0c;打开“组件服务”→“计算机”&#xff0c;在“我的电脑”上右键点击&#xff0c;选“属性”&#xff1b;然后点默认属性&#xff0c;把“在此计算机上启用分布式COM&#xff08;E&#xff09;”的勾去掉&a…

深入理解Spring Boot:从入门到精通

摘要 Spring Boot是一个用于构建独立、生产级别的Spring应用程序的框架。它以简化配置和快速开发为设计目标&#xff0c;使开发人员能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的核心概念、特性和最佳实践&#xff0c;帮助读者从入门到精通。 引言 在当今的软件开发…

pod 控制器 4

对于 pod 使用 yaml 文件或者 json 描述文件生成&#xff0c;之前都有提到过&#xff0c;且对 yaml 的每一个属性都有介绍到 确实是属性非常的多&#xff0c;但是我们知道如何去区分哪些是重要的部分&#xff0c;哪些是可有可无的部分之后&#xff0c;这些就变得简单了 pod 的…

用Linux搭建网站(LAMP)

安装环境 演示服务器版本为CentOS 8 安装apache 下载apache yum install httpd httpd-devel 启动apache服务器 systemctl start httpd设置apache开机自启 systemctl enable httpd查看apache运行状态&#xff0c;绿色即正常运行 systemctl status httpd关闭和禁用防火墙 …

Python语言在地球科学领域中的实践技术

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;Python能够运行在Linux、Windows、Macintosh、AIX操作系统上及不同平台&#xff08;x86和arm&#xff09;&#xff0c;Python简洁的语法和对动态输入的支持&#xff0c;再加上解释性语言的本质&…

《Redis 核心技术与实战》课程学习笔记(一)

基本架构&#xff1a;一个键值数据库包含什么&#xff1f; 这样学 Redis&#xff0c;才能技高一筹 为了保证数据的可靠性&#xff0c;Redis 需要在磁盘上读写 AOF 和 RDB&#xff0c;但在高并发场景里&#xff0c;这就会直接带来两个新问题&#xff1a; 一个是写 AOF 和 RDB …

关于Kettle ETL java脚本编写遇到的一些问题记录

Kettle ETL java脚本编写遇到的一些问题记录 1.文本信息输出 使用方法**logBasic()**参数必须是字符串 这部分内容会在ETL的日志窗口显示 2.获取参数数据 1.获取上个节点传输的数据 可以直接在左侧双击获取 2.全局参数获取 在启动运行的变量设置参数 在java代码中获取方式 …

Unity内存分析与优化实践

目录 前言优化前分析Committed Memory Tracking StatusMemory Usage 开始内存优化贴图优化贴图分辨率优化去除透明通道和mipmap其他关于贴图的优化技术 Shader优化优化Always Included Shaders优化Preloaded Shaders优化Shader代码共享Shader 优化Mesh降低屏幕分辨率优化效果内…

IDEA+Spring Boot+MyBatis+shiro+Layui+Mysql智能平台管理系统

IDEAJavaSpring BootMyBatisshiroLayuiMysql智能平台管理系统 一、系统介绍1.环境配置 二、系统展示1.登录2.注册3.发帖4.留言5.提交问卷6.展示公告7.查看文章8.管理员登录9.管理员管理10.用户管理11.问卷管理12.问卷结果管理13.帖子分类管理14.数据分析统计15.公告管理16.帖子…

基于线性准则的考虑风力发电不确定性的分布鲁棒优化机组组合(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…