Linux第一个小程序-进度条
目录
行缓冲区概念
\r 和 \n
进度条代码和演示
行缓冲区概念
用两段代码来感受下行缓冲区的存在
#include<stdio.h>
#include<unistd.h>
int main()
{
printf("hello world\n");
//printf("hello world");
//fflush(stdout); //强制刷新
sleep(5);
return 0;
}
上面的这段代码会输出什么?
它会输出hello world之后换行 并且还会休眠五秒 之后结束程序
运行结果也符合我们的预期
可是如果我们将代码改成这样子呢?
#include<stdio.h>
#include<unistd.h>
int main()
{
//printf("hello world\n");
printf("hello world");
//fflush(stdout); //强制刷新
sleep(5);
return 0;
}
并没有按照我们的预期运行 而是直接开始了五秒sleep 之后再打印出了hello world
这里是因为行缓冲区的存在
我们的显示器对应的是行刷新
即当行被刷新(可以通过换行刷新) 或者被写满的时候才会被打印出来
而hello world既没有写满行 又没有刷新行缓冲区 所以自然不会被打印到显示器当中
\r 和 \n
- \n 换行 让光标下移一格
- \r 回车 让光标回到这一行的行首
当我们敲击键盘上的enter键的时候实际上就等于 /n + /r
既然 /r 是让光标回到这一行的行首
如果我们写下一个数之后立马使用 /r 回到这一行的行首继续写一个数 那么这个数就被我们覆盖了
其实这个问题的本质就是 /r 会不会刷新行缓冲区 如果不会那么前面写的数就会被后面写的数覆盖
我们写出下面的代码
#include<stdio.h>
#include<unistd.h>
int main()
{
int count = 10;
while(count)
{
printf("%2d\r", count);
fflush(stdout);
count--;
sleep(1);
}
return 0;
}
\r 并不会刷新行缓冲区 如果想要将每个数字打印出来我们则需要一个行缓冲区刷新函数
这个函数就是 fflush(stdout)
进度条代码和演示
我们要设计一个进度条首先至少要有100个空间
我们的每个 '=' 号对应着一个空间 有多少个 '=' 也就代表着到了百分之几
我们首先写出下面的代码
其中 usleep的单位是纳秒 1毫秒 = 1000纳秒
所以50000纳秒 = 50毫秒
走100次也就是5000毫秒 也就是说这个程序会在5秒左右走完
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
#define NUM 100
char bar[NUM+1];
memset(bar, '\0', sizeof(bar));
const char* lable = "|/-\\";
int i = 0;
while(i <= 100)
{
printf("\033[31m[%-100s][%3d%%][%c]\r", bar, i, lable[i%4]);
fflush(stdout);
bar[i] = '=';
i++;
usleep(50000);
}
printf("\n");
return 0;
}
这样也是类似的
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 }