Linux实现进度条小程序
1.预备的两个小知识
usleep这个函数的参数是微秒数,作用是让程序休眠对应的微秒数
1秒=1000毫秒
1毫秒=1000微秒
1微妙=1000纳秒
等等等等
因此下面的代码中的
usleep(1000000)=1秒
1.缓冲区
1.缓冲区概念的引出
首先,先让大家看两份代码,分析一下为什么出现这种情况?
请注意:这个代码的运行情况是:先打印的hello world,后休眠了1秒
然后我改动了一个地方,把那个’\n’去掉了
请注意:
这个代码的运行情况是:先休眠了一秒,然后才打印出hello world
为什么会这样呢?
2.缓冲区的概念
注意:程序结束时会自动刷新缓冲区,把缓冲区当中的数据打印出来
此时我们发现,这个代码的hello world就成功地在休眠之前打印出来了
2.回车与换行
1.小例子
其实,回车和换行是不同的
有什么不同呢
比方说:
你现在是一个高中生,你在上作文课,老师要求大家去写一篇作文
你就在作文纸上面去写,你的笔尖就相当于显示器上的光标
你的作文纸就相当于这个显示器
当你写完一段之后,你的笔尖下移:就像这样
光标只进行下移这一个操作,这就叫做:换行
但是真正写作文的时候,我们肯定不能只换行,我们一定要再让笔尖(光标)移动到当前行的最开始处然后再去写(这里不纠结新开一个段落要空两个格),就像这样:
第二个操作我们叫做回车
但是呢,我们的电脑上面的回车键其实完成了两个工作:换行+回车
在我们的旧一些的键盘上回车键就是这么标明的:
其实我们C语言当中的’\n’也是完成了这两个任务:换行+回车
所以我们在日常生活中几乎不会深究这两个概念的区别
那么C语言中有没有回车呢?
当然有啦:‘\r’
不过请注意: '\r’无法自动刷新缓冲区,因此我们需要用刚才提到的fflush库函数来刷新缓冲区
2.倒计时小程序
其实有了上面那两个概念之后,我们就能够写出一个倒计时小程序来了
那应该怎么写呢?
于是我们就可以写出这样的代码
我期待的是10 -> 9 -> 8 …-> 1 -> 0
结果是: 10 -> 90 -> 80 …-> 10 ->00
为什么会出现这种情况呢?
其实我们的显示器是并不会给我们直接打印10这个数字的
而是先打印字符’1’,然后打印字符’0’
连在一起之后我们就会认为那是10
也就是说我们的这个倒计时的过程其实是这样的
每次我们覆盖上一个数据只是覆盖了第一个字符’1’而已
第二个字符’0’一直都没有被覆盖
那我们应该怎么办呢?
我们知道printf是可以控制输出格式的
printf("%2d\r",count); 这样就可以把那个'0'也给覆盖掉了
因此我们可以这样改动代码
倒计时是成功了,但是它这个数字却总是右对齐的,能不能让它左对齐呢?
当然可以啦
只需要加一个-即可
printf("%-2d\r",count); 这样就可以左对齐了
这样我们的倒计时就大功告成了