Linux中的第一个小程序- - -进度条
write in front
作者:@ 不进大厂不改名
专栏:@ Linux
作者简介:大一学生 希望能向其他大佬和同学学习!
本篇博客简介:Linux中的第一个小程序,顺便了解一下行缓冲区的概念。
本章目标:
1.行缓冲区的理解
2.进度条程序详解
1.行缓冲区的概念和理解(fflush函数)
当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是标准输入(stdin)和标准输出(stdout)。
看了上面的的概念是不是一脸蒙蔽,没有关系我们下面看一个程序来简单理解一下。
我们来分析一下这个程序,先打印“Hellow Linux!”,然后换行再睡眠3秒然后结束程序。
结果确实是这样的(打印了“Hellow Linux!”后停了三秒才结束)
如果改为这样呢?(去掉\n)
我们还是先分析一下:那这样会变成打印“Hellow Linux!”后不换行然后休眠三秒结束程序。
我们可以运行一下试试!
这里不符合我们的预期,程序是先进行3秒的休眠再打印“Hellow Linux!”
这是为什么呢?
按道理来说应该是顺序执行:执行打印“Hellow Linux!”后不换行然后休眠三秒结束程序。
答:这里是因为有行缓冲区的存在。
我们的显示器对应的是行刷新(换行可以进行刷新),即当行被写满的时候才会被打印出来.
而Hellow Linux!即没有写满行,也没有刷新缓冲区,所以并不会被打印到显示器上来。
\r和\n
\n:换行(让光标下移一格)
\r:回车(让光标回到这一行的行首)
当我们敲出enter时实际上就等于"\n+\r"
那么同学们可能会想到既然"\r"是立马回到这一行的行首,那么如果我们打印一个数使用\r回到行首继续写一个数,那么之前写的数会不会被覆盖了呢?
其实上这个问题的实质就是/r会不会刷新行缓冲区,如果它不会刷新行缓冲区,那么后面写的数就会被前面写的数覆盖,我们用下面的程序进行验证一下:
运行结果:
最后发现什么都没有打印,因此可以判定\r并不会刷新行缓冲区,如果想要将每个数字打印出来我们就需要一个缓冲区刷新函数。
这里刚好就有一个就是fflush(stdout)
加上这个函数我们再试试看:
我们发现它变成一个倒计时了(下面是两个时刻的倒计时)
2.进度条的详细介绍
这里先说一下进度条代码的思路:
1.我们要设计一个进度条程序至少要有100个空间吧
2.我们的每个“#”对应者一个空间,有多少个“#”就代表到了百分之几
3.其中先介绍一下下面用到单位的意义和换算关系
usleep的单位是纳秒,1毫秒=1000纳秒
所以50000纳秒=50毫秒
走100次也就是5000毫秒,也就是程序会在5秒内运行完。
我们先写出这个基础程序
结果可以看见进度条初步实现了
但是我们觉得还是缺点什么,所以我们加上了框框可显示进度条的具体数字。程序如下:
最后的结果大家可以试试!