Linux首战之进度条

发布时间:2026/8/20 11:05:52
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.hprocessbar.cmain.c3.初步编辑makefile4.编写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下标就能保证光标不停旋转。