【Linux】在Linux下实现进度条程序
【问题】在Linux下实现一个进度条程序,通过makefile进行编译。
首先,我们需要知道进度条是怎么实现的?进度条的动态效果是利用人眼的视觉暂留做到的。比如说:
先输出: “= ”表示1%
在下一次则显示:“== ”
再一次: “=== ”
由于刷新速度很快,给人的感觉就是在逐次递增,直到完成加载。
这个程序中有几个需要注意的点:
1、缓冲区与回车换行
在使用printf的时候:printf("hello\n")------->buffer-------->file
printf并不会直接将数据写入终端显示文件,而是将数据先写入到一块缓冲区中(标准输出缓冲区),目的是为了提高写入效率(将碎片化的数据集中写入文件,而不是每得到一点数据都进行写入操作),等到手动刷新缓冲区,或者缓冲区内容写满的时候,才会将数据写入文件;
printf中的 \n 具有刷新缓冲区(将数据写入文件)的作用,当然主要作用还是换行,将输出起始位置移动到下行行首。
printf中的 \r 是回车作用,将输出起始位置移动到本行行首。此处我们并不需要换行。
因为printf会按行刷新,如果直接用的话就只能得到一个满的进度条了,所以就要用到 fflush()函数来强制刷新缓冲区了。
2、makefile
使用makefile自动化编译可以增加效率,尤其在项目源文件有若干个.c 和.h 文件的时候,这一特点更为明显。
第一行:依赖关系
第二行:依赖方法,(注意必须以Tab键开头,刚开始使用makefile一定要注意细节)
3、memset
对各种类型的数组进行初始化,避免出现野值。正确用法如下:
- 可以用任何值来初始化char数组,比如:memset(arr,'a',10);
- 可以用0来初始化任何类型数组,比如:memset(arr,0,sizeof(arr));
进度条代码如下:
其中"\e[31m"表示将输出的“=”的颜色改为红色,后面的“\e[0m”表示之后的颜色恢复到默认值,以避免影响到终端所有的显示文本颜色。
makefile:
最终运行结果: