Linux首战之进度条

有句标题很好------实践是检验真理的唯一标准,手上有了vim,gcc/g++和make/makefile工具以后,让我们利用它们来完成首个linux项目------进度条。

一.知识补充

1.回车换行的细解

按一下回车键,其实是执行回车和换行两个动作 ,换行是将光标定位到下一行的同一位置,而回车是回到一行的开头。

举个作文格的例子:

在计算机语言中,换行符是\n,回车符是\r。而用组合技\r\n来实现回车换行操作。但是为什么c/c++写一个\n就能实现回车换行呢?答案是在编译解析的时候就自动把\n变成了\r\n。

2.粗略见识缓冲区与一个反直觉的现象

我们暂且将缓冲区当成一段内存块。

反直觉现象

这段代码在打印那里去除了"\n"以后,执行顺序是先打印再休眠,但执行结果看似却变成了先休眠再打印。这是为什么呢?

事实上执行结果也依然是先打印再休眠,只是3s休眠之前,应该打印出来的hello_world被存进了缓冲区里 ,那么在3s休眠之后,它为什么又被从缓冲区里放出来了呢?答案在于休眠完以后,程序结束,自动进行行刷新,将缓冲区里的东西刷新出来。综上出现了先休眠再打印的错觉。

错觉产生的示意图:

那为什么在打印字符串后增加"\n"就可以实现执行结果看起来还是先打印再休眠呢?

\n会先行刷新再换行 ,也就是说打印执行完以后,会对该行进行刷新,将缓冲区里的字符串刷新出来,换行,然后再进行休眠。

fflush

那么如何在没有"\n"的情况下,也能做到立马刷新出hello_world呢?

这里在printf的下一行输入一个代码------fflush(stdout),该指令用于强制刷新。

二.实践

1.小试牛刀------倒计时

我们想要数字始终在原位而非换行,就需要用到\r,让光标回到首字符,然后让下一个数字把上一个覆盖掉,但\r没有缓冲区刷新的功能,因而要在打印语句下面增加fflush(out)。

代码:

2.进度条

样式图和要求:

原理版制作过程:

1.首先创建项目目录,并打开:
2.该目录下创建文件:processbar.h,processbar.c,main.c
3.初步编辑makefile
4.编写processbar.c里"#"增加和百分比的部分

①.由于#每循环一次,增加一个,就可以用到上面的\r和fflush将每次的#打出来,然后每次覆盖掉上一次的,就能在视觉上呈现"#"增加。

②.在字符串左边预留100个字符,即100s,这就能保证从右往左打#,即右对齐,从而让进度条右边不移动。

但我们要的是从左往右打啊,没关系,在100前加一个"-"就行了,"-"代表左对齐。

③.那么如何设置百分比呢?简单啊,printf里新增一个元素就行了。

代码:

输出结果:

简直完美!

5.processbar.c可转动光标的实现
①.原理

依旧用到printf,\r和fflush(stdout)在同一位置不断显示刷新覆盖"|/-\|"。

②.实现

用一个字符串lable装"|/-\\",然后求lable长度len,打印时用cnt模len,作为lable的下标,这就能使得下标不会越界。

代码:

实现:

由此,第一代进度条完成。

但这样的进度条是没法用的,它并不是根据真实的下载进度去跑的,所以我们接下来要去实现一个能用的进度条。

改进版代码:

main.c:
processbar.c:

由于函数一直被调用,所以运用这个特点去创建一个static计数器cnt,每调用一次就++一次,同时让cnt%len,让其不越界,随后让其作为lable下标,就能保证光标不停旋转。

相关推荐
java_logo1 小时前
Docker 部署 Dify:轻松搭建 LLM 应用开发平台
运维·docker·容器
方便面不加香菜3 小时前
Docker Container -- 综合实战案例详解
运维·docker·容器
LongRunning3 小时前
【Linux】RK3568-OpenCV+YOLO(八)
linux·opencv·yolo
海洋之恒4 小时前
GitHub Actions 自动化:5 个真实运维提效案例
运维·自动化·github
迪康coolmu5 小时前
出差终端数据安全落地实战:基于迪康端点安全一体化管理系统的四道防线实践
运维·服务器·经验分享·笔记·其他·安全·php
民乐团扒谱机6 小时前
【微实验】NSGA-II(非支配排序遗传算法)——解决多目标优化问题的“自然选择模拟器”
linux·人工智能·算法
물の韜7 小时前
ZYNQ/FMQL系列Linux之I2C开发实战
linux·arm开发·嵌入式硬件·设备树·iic·zynq
qq_371802117 小时前
Ubuntu Linux中安装WorkBuddy
linux·运维·服务器·ubuntu
无足鸟ICT7 小时前
【RHCA+】iptraf-ng(网络监控分析)
linux·网络