一、前言
进度条程序曾经是百度的一道面试题。
这一期博客我们来介绍代码和原理究竟是怎样的。
二、知识点
1.回车和换行
通常意义上我们以为回车就是就是键盘的那个回车键。
其实不然。回车其实是不换行,回到本行开头。我们通常用符号表示为 \r 。
换行就是新起一行,换行则用符号表示为 \n 。
所以我们通常用的键盘的上的这个键位其实叫做回车换行。
2.缓冲区概念
我们看下面这段代码
int main()
{
printf("hello world\n");
sleep(3);
}
int main()
{
printf("hello world\r");
sleep(3);
}
这两段代码看着就是一个符号不同,结果却天差地别。
先说结果:第一种,是先打印 hello world 然后换行之后休眠3秒。而第二种却是先休眠3秒,再打印hello world 。
这是因为将 hello world 输入到缓冲区之后遇到 \n 马上会刷新缓冲区,然后执行休眠操作。
而第二种代码遇到 \r 不会刷新缓冲区,后面接着执行休眠之后,程序退出的时候刷新缓冲区我们才能看到 hello world 。
而我们制作进度条程序的时候,要用到 \r 符号,但是我们又想要刷新缓冲区,我们可以用到 fflush 函数,可以手动刷新缓冲区。
3.制造动态转圈效果
当我们进度条卡住的时候,如何让人家知道是不是还在加载呢?
我们可以用四个符号制造一个动态转圈的效果
‘|’ ‘\’ '-' '/',这四个符号我们只要在同一位置循环打印的时候,就能制造一个转圈的动态效果。
四、效果展示
进度条
五、代码
makefile
myproc:myproc.c main.c
2 gcc myproc.c main.c -o myproc -DN=1
3 .PHONY:clean
4 clean:
5 rm -f myproc
myproc.h
#include <stdio.h>
#include <string.h>
#include <unistd.h>
define MAX 101
#define S_NUM 5
extern void MyProc();
myproc.c
#include "myproc.h"
char style[S_NUM] = {'#','-','.','+','>'};
void MyProc()
{
char arr[MAX];
memset(arr,'\0',sizeof(arr));
int cnt = 0;
const char lable[] = {'|','\\','-','/'};
while(cnt <= 100)
{
printf("[%s][%-3d%%][%c]\r",arr,cnt,lable[cnt%4]);
fflush(stdout);
arr[cnt++] = style[N];
usleep(50000);
}
printf("\n");
}
main.c
#include "myproc.h"
int main()
{
MyProc();
return 0;
}