在编写进度条之前我们需要先了解一下进度条的实现原理,printf函数缓冲区问题以及 \n与\r的区别。
首先:进度条的实现原理:
通过增加字符来保证进度的增加。所以我们给定一个102的定长数组(下标从0到101),0号下标不使用,1到100表示进度,101号表示进度条完成时的结束标志(C语言中字符串结束符是\0)。打印进度条时,只打印一行,并且是递增 形式的打印,所以需要回到当前行的起始位置并且实时刷新打印,此时就涉及到\r以及缓冲区的问题。
其次:\n与\r:
\n:换行符+回车
\r:回车符
最后:printf缓冲区:
输出到屏幕相当于访问外设,而外设的速度和内存的速度是相差甚远的,如果每次输出都直接去访问外设,一定会造成效率的下降。所以,printf设置了三种缓冲方式。
1.全缓冲,即整个缓冲区满才会输出到外设。
2.行缓冲,即写满一行输出到外设,即遇到\n,
3.无缓冲,不用等待,实时的输出。
进度条需要实时显示当前状态,即采用无缓冲方式,此时就要使用fflush函数来实现。
下面是linux下进度条的简单实现:
运行结果如下图: