有句标题很好------实践是检验真理的唯一标准,手上有了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下标,就能保证光标不停旋转。
