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