进度条
- 基础知识
- 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 1015 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 1015 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 else22 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 }
看看效果:
这下就非常类似我们的下载过程了!