作者:@小萌新
专栏:@Linux
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:写出Linux中的第一个小程序 进度条
进度条小程序
- 行缓冲区概念
- \r 和 \n
- 进度条代码和演示
行缓冲区概念
我们首先用两段代码来感受下行缓冲区的存在
上面的这段代码会输出什么?
毫无疑问 它会输出hello world之后换行 并且还会休眠三秒 之后结束程序
运行结果也符合我们的预期
可是如果我们将代码改成这样子呢?
去掉了换行符 那么代码会打印出hello world之后不换行然后休眠三秒结束程序嘛
我们可以编译之后运行试试
我们可以发现并没有按照我们的预期运行 而是直接开始了三秒sleep
之后再打印出了hello world
那么这是为什么呢? 按照道理说顺序结构的运行应该是先打印再睡眠的啊
这里其实是因为行缓冲区的存在
我们的显示器对应的是行刷新
即当行被刷新(可以通过换行刷新) 或者被写满的时候才会被打印出来
而hello world既没有写满行 又没有刷新行缓冲区 所以自然不会被打印到显示器当中
\r 和 \n
- \n 换行 让光标下移一格
- \r 回车 让光标回到这一行的行首
当我们敲击键盘上的enter键的时候实际上就等于 /n + /r
那么有意思的部分就来了 既然/r是让光标回到这一行的行首
如果我们写下一个数之后立马使用/r回到这一行的行首继续写一个数
那么是不是这个数就被我们覆盖了呢?
其实这个问题的本质就是/r会不会刷新行缓冲区 如果不会那么前面写的数就会被后面写的数覆盖
我们写出下面的代码
最后的结果是这样子的
我们可以发现最后什么都没有打印
这是因为\r并不会刷新行缓冲区的缘故 如果想要将每个数字打印出来我们则需要一个行缓冲区刷新函数
这个函数就是 fflush(stdout)
加上这段代码之后我们再编译运行程序试试看
我们可以发现 这里它就变成了一个倒计时器了
进度条代码和演示
我们要设计一个进度条首先至少要有100个空间
我们的每个 ‘#’ 号对应着一个空间 有多少个 ‘#’ 也就代表着到了百分之几
我们首先写出下面的代码
其中 usleep的单位是纳秒 1毫秒 = 1000纳秒
所以50000纳秒 = 50毫秒
走100次也就是5000毫秒 也就是说这个程序会在5秒左右走完
这是这样子好像还是缺少点什么 我们尝试用两个框框把这个字符串框起来这样子好看一点
此外 我们可以在这框框外面加上一个框框 里面显示程序走了百分之多少了
此时这个进度条程序已经初具雏形了
如果我们还想要这个这个进度条是否在工作中则需要在它的最后加上一个旋转的小圈圈 如果这个圈圈还在旋转则表示仍然在加载中
这样子我们的进度条小程序就完成啦
源代码如下
1 #include <stdio.h>
2 #include <string.h>
3 #include <unistd.h>
4
5 int main()
6 {
7 char pb[102];
8 memset(pb,'\0',102);
9 int i = 0;
10 char arr[4];
11 arr[0] = '\\';
12 arr[1] = '|';
13 arr[2] = '/';
14 arr[3] = '-';
15 while (i != 100)
16 {
17 pb[i] = '#';
18 printf("[%-100s][%%%d][%c]\r",pb,i+1,arr[i%4]);
19 fflush(stdout);
20 usleep(50000);
21 i++;
22 }
23 return 0;
24 }