进度条
- 基础知识
- 1 \r && \n
- 2 行缓冲区
- 3 函数介绍
- 进度条实现
- 版本 1
- 代码实现
- 运行效果
- 版本2
- Thanks♪(・ω・)ノ谢谢阅读!!!
- 下一篇文章见!!!
基础知识
1 \r && \n
我们熟悉的\n
实际上是两个操作 换行与回车
回车是将光标回到行开头
换行时将光标移到下一行
而“\r” 执行的是回车操作
我们可以看一下例子:
- 使用 “ \n ”
来看效果:
- 不使用“ \n ”
来看效果:
为什么会产生这样的区别???
原因就在缓冲区
2 行缓冲区
缓冲区是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
“\n” 可以清空缓冲区 使内容出现在显示器是上
fflush()函数也可以完成类似功能。
3 函数介绍
- Sleep函数
Sleep函数可以使计算机程序(进程,任务或线程)进入休眠,使其在一段时间内处于非活动状态。
注意在VC中Sleep中的第一个英文字符为大写的"S"
在标准C中是sleep(S不要大写),下面使用大写的来说明,具体用什么看你用什么编译器。简单的说VC用Sleep,别的一律使用sleep。
其中,Sleep()里面的单位,是以毫秒为单位,所以如果想让函数滞留1秒的话,应该是Sleep(1000);另外还需要引用头文件 #include <windows.h> - usleep()函数
usleep功能把进程挂起一段时间, 单位是微秒(百万分之一秒)
注意需要引头文件 #include <unistd.h>个函数不能工作在windows 操作系统中。用在Linux的测试环境下面
进度条实现
版本 1
代码实现
progressbar.h
1 #include <stdio.h>
2 #include<string.h>
3 #include<unistd.h>
4
5 void progressbar();
progressbar.c
1 #include"progressbar.h"
2
3 #define style '#'
4 #define Length 101
5
6 void progressbar(){
7 char str[Length];
8 memset(str,'\0',sizeof(str));
9
10 int cnt = 0;
11
12 while(cnt<101){
13 printf("[%-100s][%3d%%]\r",str,cnt);
14 fflush(stdout);
15 str[cnt++] = style;
16 usleep(20000);
17 }
18 printf("\n");
19
20 }
main.c
1 #include"progressbar.h"
2
3 int main(){
4 progressbar();
5 return 0;
6 }
运行效果
版本2
显然 没有进度条会单独使用,一般都是搭配下载使用。
所以接下来我们来模拟一些下载过程:
progressbar.c
1 #include"progressbar.h"
2
3 #define style '#'
4 #define Length 101
5
6 void progressbar(double total, double current){
7 char str[Length];
8 memset(str,'\0',sizeof(str));
9
10 int cnt = 0;
11 double rate =(current * 100.0) / total;
12 int loop = (int)rate;
13
14 while(cnt <= loop){
15 str[cnt++] = style;
16 }
17
18 if(rate >=100){
19 printf("[%-100s][%0.1lf%%]\r",str,100.0);
20 }
21 else
22 printf("[%-100s][%0.1lf%%]\r",str,rate);
23
24 fflush(stdout);
25
26 }
main.c
1 #include"progressbar.h"
2
3 double bandwidth = 1.0 * 1024 *1024;
4
5 void download(double total){
6
7 double current = 0;
8 printf("Download Begin!\n");
9
10 while(current <= total){
11
12 current += bandwidth;
13 progressbar(total,current);
14 usleep(1000000);
15 }
16 printf("\ndownload done, filesize: %.1lf\n",total);
17 printf("\n");
18 }
19 int main(){
20
21 download(7.8*1024*1024);
22
23
24 return 0;
25 }
看看效果:
这下就非常类似我们的下载过程了!