今天我们实现一个进度条的小玩意儿,很简单,我们先看看成果
在学习计算机时,你在很多地方有可能看到到缓冲区的字样,那什么是缓冲区啊?,我们先看一下现象
我是在Linux环境下演示,window环境下演示可能会没有效果。
#include
int main()
{
printf("你好,缓冲区");
sleep(3); //在Linux环境下sleep的单位 秒
return 0;
}
你会发现当我们执行程序时,会有大概几秒的延迟,可我们不是先执行的printf函数吗,后面才是sleep,实际上这也是事实,只不过当我执行printf后,我们想要输出的内容被放到一个缓冲区里面了,后面才会被打印出来,下面我将仔细的说一下什么缓冲区
本质上 缓冲区就是一块内存,我们将想要输出的数据放到缓冲区中,当我们刷新缓冲区的时候会把他打印出来,我们可以把数据当成一个水池,缓冲区看作打水的的木桶,当水桶满了的时候或者我们就是想要一半的水,就把水倒出来。
什么情况下缓冲区会刷新
下面我们一一演示
我们演示一下,大家就懂了
#include
int main()
{
while(1)
{
printf("hello world");
sleep(3);
}
return 0;
}
由于时间有些长,我们就不等了,结果是当缓冲区满了后,屏幕上会出现一屏幕的 hello world
我们这里的换行是指的 \n,它可以是缓冲区刷新
#include
int main()
{
while(1)
{
printf("hello world\n");
sleep(3);
}
return 0;
}
在C语言中提供了一个函数,它可以强制刷新缓冲区,这就是 fflush(),它是stdio.h中的库函数,在一个C程序中,编译器会默认打开 3 个标准输入输出流,分别是下面的,这一点知道就可以了
#include
int main()
{
while(1)
{
printf("hello world");
fflush(stdout);
sleep(3);
}
return 0;
}
有很多人都搞不懂这两个有什么区别,我们今天重点说一下
我们举一个写文章的例子,当我们在“我叫张三,外号法外狂徒。”这句话再开一行时,看看他们之间的区别
有人可能会感到疑惑,这和我们用的不对啊,我们之前使用下面的代码时,都是再下一行的开头直接打印,实际上这是C语言的编译器默认将换行回车这两个浓缩到 \n了
printf("hello world\n");
printf("hello world\n");
我们先演示一下效果
#include "ProcBar.h"
int main()
{
int count = 10;
while(count--)
{
printf("%d\r",count);
sleep(1);
}
printf("hello word\n");
return 0;
}
注意看,我们没有打印出9,8,7,6,5这样的数据,原因是缓冲区的因素,我们使用函数刷新一下缓冲区看看效果
#include "ProcBar.h"
int main()
{
int count = 10;
while(count--)
{
printf("%d\r",count);
fflush(stdout);
sleep(1);
}
printf("hello word\n");
return 0;
}
有了上面的知识点,我们就可以写出自己的进度条了,由于多文件情况下阅读的体验不太好,我把代码写在一个文件中
usleep() 和 sleep()的作用一样,不过它的单位是 毫秒
memset() 是 string.h库的一个函数,它可以把数组内部都初始化指定的 数据
%-100s 设置100的字段,- 表示 左对齐
%d%% 是为了了打印 百分比 %是转换说明,所以用 两个%代替一个% %% -> % 详细的请转换说明
#ifndef __INCLUDE_H__ //防止头文件被重复引用
#define __INCLUDE_H__
#include
#include
#endif
void proBar()
{
const char* p = "|/-\\";
int i = 0;
char arr[101] = { 0 };
memset(arr, '\0', sizeof(arr));
while (i <= 100)
{
printf("[%-100s][%d%%][%c]\r", arr, i, p[i % 4]);
fflush(stdout);
arr[i++] = '#';
usleep(80000);
}
printf("\n");
}
int main()
{
proBar();
return 0;
}
这样,你的进度条就完成了,我们也可以给进度条添加颜色,C语言是支持的,不过这就要你自己去处理了