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下标,就能保证光标不停旋转。

相关推荐
两斤牛肉一壶酒4 小时前
opencode 技能加载全挂背后,竟是不用系统的ripgrep
linux
j7~4 小时前
【Linux网络加餐(二)】《进程组,会话,控制终端,作业控制和守护进程》---详解
linux·运维·服务器·守护进程·会话·进程组·控制终端
名字还没想好☜4 小时前
Docker 数据卷实战:volume、bind mount、tmpfs 到底怎么选,数据持久化与权限坑
运维·docker·容器·kubernetes
天道jimmy4 小时前
VulnHub 系列:Prime,1
linux·运维·服务器
xiaoye-duck4 小时前
《Linux 网络编程》深入传输层 UDP 协议原理:端口、报文、缓冲区与内核源码解析
linux·网络·udp
Lumistory4 小时前
从OPPO长安研发中心看头部科技企业的照明运维选择
大数据·运维·人工智能·光照贴图
好评1245 小时前
【Linux】数据链路层
linux·运维·网络
辻弋2016 小时前
自动检测硬件生成驱动清单、实时监控FPS、120秒性能记录——30+项优化模块化开关,所有改动可精确复原
服务器·windows·游戏引擎·电脑·开源软件
CC城子6 小时前
EtherNet/IP I/O 丢包排查(linux系统)
linux·单片机·tcp/ip·ethernetip
新时代牛马6 小时前
Linux 信号处理完整篇:从sigaction、掩码到内核发送与可重入排障
linux·运维·信号处理