【Linux】从0到1实现一个进度条小程序

在这里插入图片描述
在这里插入图片描述

个人主页:🍝在肯德基吃麻辣烫
我的gitee:gitee仓库
分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处


文章目录

  • 前言
  • 一、理解回车 '\r' 和换行 '\n'
  • 二、初步认识缓冲区
    • 1. 认识第一个函数:sleep
    • 2.观察缓冲区出现的现象
    • 3. 认识第二个函数:fflush
  • 三、开始输出进度条
    • 了解倒计时
    • 准备工作
  • 总结

进度条实现:

在这里插入图片描述


前言

本文讲解如何从0到1实现一个进度条小程序。


一、理解回车 ‘\r’ 和换行 ‘\n’

我们在写作文的时候,写到了一行的结尾,就得另起一行并到开头继续写。在这里插入图片描述

其中,这个另起一行的动作就是"换行"
回到开头的动作就是"回车"

  • "回车"这个动作对应的c语言的转义字符是 ‘\r’
  • "换行"这个动作对应的c语言的转义字符是 ‘\n’

但是,\n其实包含了回车和换行两个动作。
我们的键盘上面的回车键也是同时包含回车和换行两个动作。


二、初步认识缓冲区

1. 认识第一个函数:sleep

sleep(1);

sleep函数的功能是让计算机等待指定秒数(单位:秒)后再继续启动。
知道sleep的功能即可。

还有一个睡眠函数:usleep,它们的功能相同,只不过这个函数的单位是微秒

1秒 = 1000毫秒
1毫秒= 1000微秒

2.观察缓冲区出现的现象

来看第一段代码出现的现象:

  2 #include "process.h"3 4 int main()5 {6     printf("Hello Linux\n");7     sleep(2);8 9     return 0;10 }        

现象:

在这里插入图片描述
第二段代码:

  2 #include "process.h"3 4 int main()5 {6     printf("Hello Linux");7     sleep(2);                                                                                                                        8 9     return 0;10 }

现象:

在这里插入图片描述

通过这两段代码以及出现的现象可知:

  • 1.第一段代码是直接弹出 “Hello Linux” 字段后两秒,再弹出指令行。
  • 2.第二段代码是两秒过后,再打印"Hello Linux",并且指令行是紧随其后的。

问:第一个现象是先执行printf函数还是先执行sleep函数?

实际上,c语言是从上往下扫描代码的,所以一定是先执行printf函数。那么,在sleep两秒期间,printf函数去哪了呢?

一定是被保存起来了。

这个保存的东西,就叫做缓冲区

在c语言有一块内存叫做缓冲区

缓冲区是由c语言维护的一块内存空间。

到这里就可以解答第一个现象了,首先执行printf函数,输出Hello Linux,先保存到缓冲区中,2秒后再输出到显示器文件中,由于没有换行,后面则紧跟着指令条。

为什么第二个现象是马上就输出Hello Linux,再睡眠两秒呢?

这是因为'\n'这个换行符,具有刷新缓冲区的功能。

也就是把缓冲区里面的东西给刷掉,让它走它该走的地方,别停留在缓冲区里面了。

至此我们可以解释第二个现象了:Hello Linux字符串其实是先保存到缓冲区中的,然而

遇到'\n'这个换行符刷新后,将该字符串输出到了显示器文件中,再执行2秒休眠,这

才是我们看到的东西。

3. 认识第二个函数:fflush

在c程序中会默认打开三个流:标准输入流,标准输出流,标准错误流。
这里只考虑标准输出流,该流的默认数据是stdout,也就是显示器文件。

fflush函数的功能是:将缓冲区的内容写入到标准输出流。
通俗一点就是将缓冲区的内容打印到屏幕上。

有了这个函数,接下来我们就可以实现进度条小程序了。

三、开始输出进度条

了解倒计时

要实现进度条,首先要知道它每一步要输出什么。
首先讲一讲倒计时,我们见过的倒计时是这样的:
在这里插入图片描述
这里有一个需要注意的地方:

  • 每一个数字都会覆盖上一个数字

就用到开头讲到的'\r'回车符,每次输出数字后,将光标回到当前行开头,再输出,就能将上一个数字覆盖。

具体代码如下:

  2 #include "process.h"3 4 int main()5 {6     int cnt = 9;7     while(cnt)8     {9        printf("%d\r",cnt--);10        fflush(stdout);                                                                                                               11        sleep(1);12     }13     return 0;14 }
~

效果如下:

在这里插入图片描述

准备工作

知道倒计时怎么走后,我们的进度条的过程是类似的:
在这里插入图片描述
输出的过程如上,只是每一次都把数据+1,并输出在当前行,达到一个慢慢增加的效果。(这里为了演示过程,实际上每次输出数据都是输出在同一行)

  • 准备一个buf数组,数组大小为102
    • 将数组的所有元素初始化成'\0',这样每次输入都会遇到'\0'而终止
  • 可以给一个小圆圈光标,const char* lable = "|/-\\",意思是:每增加%1,光标就会变化。(这里有两个"\"是为了将转义字符’‘变成一个单纯的’')
  • 效果如下:
    -
  • 当我们输出进度条时(这个进度条的身体由你来决定),我们应该提前保留100个位置给进度条进行输出。也就是:%s–>%-100s
  • 同理,如开头看到的效果展示,为了输出%(百分号),我们需要两个百分号来输出一个单纯的百分号。

到此,贴出代码,就可以实现进度条啦!

process.h文件

  1                                                                                          2 #include <stdio.h>                                                   3 #include <unistd.h>                                                  4 #include <string.h>                                                                  5                                                                                                                                      6 void process();   

process.c文件

  1  #include"process.h"                                                                                                                 2 #define SIZE 1023 #define BODY '='4 #define HEAD '>'5                 6 char bar[SIZE]; 7 const char* lable = "|\\-/";8                             9 void process()              10 {             11     int cnt = 0;12     memset(bar,'\0',sizeof(bar));13     char c = HEAD;               14     while(cnt<100)               15     {             16         int len = strlen(lable);17         bar[cnt++] = BODY;      18         if(cnt < 100)           19              bar[cnt] = c;20         printf("[%-100s][%d%%][%c]\r",bar,cnt,lable[cnt%len]);21         fflush(stdout);                                       22         usleep(100000);                                       23                        24     }                  25     printf("\n");26 }    

main.c文件

  1 2 #include "process.h"3 4 int main()5 {6     process();                                                                                                                       7     return 0;8 }

一个进度条就新鲜出炉啦!


总结

今天的文章讲了如何在Linux上实现一个进度条小程序,做这个进度条小程序的核心是理解’\r’和’\n’两个转义字符,以及缓冲区的概念,理解之后,实现起来就不难啦。

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

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

相关文章

Stable Diffusion教程(8) - X/Y/Z 图表使用

1. 介绍 这项功能可以在 文生图/图生图 界面的左下角种 “脚本” 一栏内选择 “X/Y/Z 图表” 以启用。 它创建具有不同参数的图像网格。使用 X 类型和 Y 类型字段选择应由行和列共享的参数&#xff0c;并将这些参数以逗号分隔输入 X 值 / Y 值字段。支持整数、浮点数和范围。…

Cdiscount、速卖通卖家关键步骤:测评自养号实用技巧

作为全球领先的跨境电商平台&#xff0c;速卖通为商家提供了无限的海外销售机会。然而&#xff0c;在激烈的市场竞争中&#xff0c;要想突出重围并取得令人瞩目的销售成绩并不容易。本文将分享一些实用有效的速卖通运营技巧&#xff0c;助力你打造一个成功的跨境电商业务&#…

[剑龙]stegosaurus隐写

文章目录 [剑龙]stegosaurus隐写 [剑龙]stegosaurus隐写 hint: pwd.txt &#xff9f;ω&#xff9f;&#xff89; /&#xff40;&#xff4d;&#xff09;&#xff89; ~┻━┻ //*∇&#xff40;*/ [_]; o(&#xff9f;&#xff70;&#xff9f;) _3; c(&#xff9f;Θ&a…

IAR开发环境的安装、配置和新建STM32工程模板

IAR到环境配置到新建工程模板-以STM32为例 一、 简单介绍一下IAR软件1. IAR的安装&#xff08;1&#xff09; 下载IAR集成开发环境安装文件&#xff08;2&#xff09; 安装 2. 软件注册授权 二、IAR上手使用(基于STM32标准库新建工程)1、下载标准库文件2、在IAR新建工程&#x…

【深度学习】Collage Diffusion,拼接扩散,论文,实战

论文&#xff1a;https://arxiv.org/abs/2303.00262 代码&#xff1a;https://github.com/VSAnimator/collage-diffusion 文章目录 AbstractIntroductionProblem Definition and Goals论文其他内容实战 Abstract 基于文本条件的扩散模型能够生成高质量、多样化的图像。然而&a…

Photoshop 2023 25.0beta「Mac」

Photoshop 2023是一款专业图像处理软件&#xff0c;它主要用于图像编辑、合成和设计等方面。 Photoshop beta创新式填充的功能特色包括&#xff1a; 自动识别和删除对象&#xff1a;该功能可以自动识别图像中的对象&#xff0c;并用周围的图像填充空白部分&#xff0c;使图像看…

小鼠是否使用分布性RL?DeepMind说是的

DeepMind的研究人员发现了大脑对多巴胺的反应与分布强化学习的趋势AI理论之间的相似之处。这些发现验证了分布强化学习的潜力&#xff0c;并促使DeepMind研究人员自豪地宣称“现在人工智能研究走在正确的道路上”。 在这项新研究中&#xff0c;来自DeepMind和哈佛大学的研究人…

出现Error: Cannot find module ‘compression-webpack-plugin‘错误

错误&#xff1a; 解决&#xff1a;npm install --save-dev compression-webpack-plugin1.1.12 版本问题

极客教程 scrapy和selenium

selenium 极客教程 使用python 调用scrapy的 爬虫Spider并且相互之间可以正常传参实现全局 常规情况创建&#xff0c;使用命令 scrapy genspider baidu "baidu.com"Python中Scrapy框架详解 浏览器调试模式下&#xff08;F12 或 右键检查&#xff09;Command sh…

八、Spring 整合 MyBatis

文章目录 一、Spring 整合 MyBatis 的关键点二、Spring 整合 MyBatis 的步骤2.1 创建 Maven 项目&#xff0c;并导入相关依赖2.2 配置 Mybatis 部分2.3 配置 Spring 部分2.3 配置测试类 一、Spring 整合 MyBatis 的关键点 1、 将 Mybatis 的 DataSource (数据来源)的创建和管理…

Oracle-ORA-00600:[ktspffbmb:objdchk_kcbnew_3]

问题背景: 应用执行存储过程报错ORA-00600: 内部错误代码, 参数: [ktspffbmb:objdchk_kcbnew_3], [0], [3303775], [4], [], [], [], [], [], [], [], []&#xff0c;导致过程无法正常执行 ORA-00600: 内部错误代码, 参数: [ktspffbmb:objdchk_kcbnew_3], [0], [3303775], [4]…

电力系统监控太单调了!这个技能更高级!

随着科技的飞速发展&#xff0c;电力行业正迎来着全新的智能化变革。其中&#xff0c;配电柜监控作为电力系统的关键组成部分&#xff0c;扮演着不可忽视的角色。 配电柜监控能够确保电力系统的安全运行、提高供电可靠性&#xff0c;并迅速响应潜在问题&#xff0c;以减少停电时…

iPhone苹果手机地震预警功能怎么开启?

iPhone苹果手机地震预警功能怎么开启&#xff1f; 1、打开iPhone苹果手机设置&#xff1b; 2、在iPhone苹果手机设置内找到辅助功能&#xff1b; 3、在辅助功能内找到触控&#xff1b; 4、在iPhone苹果手机辅助功能触控内找到振动&#xff0c;如果是关闭状态请启&#xff1b; …

QGraphicsView实现简易地图3『局部加载-地图缩放』

前文链接&#xff1a;QGraphicsView实现简易地图2『瓦片经纬度』 第一篇文章提到过&#xff0c;当地图层级较大时&#xff0c;暴力全加载地图会造成程序卡顿&#xff0c;因此需要实现地图的局部加载。 实现思路&#xff1a;以地图窗口&#xff08;以下称为视口&#xff09;为地…

Redis键值设计

1.1、优雅的key结构 Redis的Key虽然可以自定义&#xff0c;但最好遵循下面的几个最佳实践约定&#xff1a; 遵循基本格式&#xff1a;[业务名称]:[数据名]:[id]长度不超过44字节不包含特殊字符 例如&#xff1a;我们的登录业务&#xff0c;保存用户信息&#xff0c;其key可以…

Deep Walk 和 Node2Vec:图嵌入

特杰帕尔库马瓦特 一、说明 DeepWalk 是一种基于图的机器学习算法&#xff0c;可为给定图生成节点嵌入。它由纽约大学的 Bryan Perozzi、Rami Al-Rfou 和 Steven Skiena 于 2014 年开发。 该算法的目标是通过分析图中每个节点的局部邻域来学习图中每个节点的表示。 DeepWalk应…

香港人力资源服务商迦里仕人才,申请纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于香港的人力资源服务商迦里仕人才&#xff08;Galaxy Payroll Group&#xff09;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&am…

Scrum敏捷开发流程图怎么画?

1. 什么是Scrum敏捷开发流程图&#xff1f; Scrum敏捷开发流程图是一种可视化工具&#xff0c;用于形象地描述Scrum敏捷开发方法中的工作流程和活动。Scrum敏捷开发流程图展示了项目从需求收集到产品交付的整个开发过程&#xff0c;帮助团队理解和跟踪项目进展&#xff0c;促…

解决VScode远程服务器时opencv和matplotlib无法直接显示图像的问题

解决VScode远程服务器时opencv和matplotlib无法直接显示图像的问题 1、本方案默认本地已经安装了VScode与MobaXterm2、在服务器端3、在本地端安装MobaXterm4、测试5、opencv显示测试&#xff08;测试过程中需保持MobaXterm开启的状态&#xff09;6、 matplotlib显示测试&#x…

原型链污染

文章目录 1. javascript 原型链2. 原型链变量的搜索3. prototype 原型链污染4. 原型链污染例题4.1 题1&#xff1a;4.2.题2&#xff1a; 1. javascript 原型链 js在ECS6之前没有类的概念&#xff0c;之前的类都是用funtion来声明的。如下 可以看到b在实例化为test对象以后&…