赞
踩
我们熟悉的\n
实际上是两个操作 换行与回车
回车是将光标回到行开头
换行时将光标移到下一行
而“\r” 执行的是回车操作
我们可以看一下例子:
来看效果:
为什么会产生这样的区别???
原因就在缓冲区
缓冲区是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。
“\n” 可以清空缓冲区 使内容出现在显示器是上
fflush()函数也可以完成类似功能。
注意在VC中Sleep中的第一个英文字符为大写的"S"
注意需要引头文件 #include <unistd.h>个函数不能工作在windows 操作系统中。用在Linux的测试环境下面
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 }
显然 没有进度条会单独使用,一般都是搭配下载使用。
所以接下来我们来模拟一些下载过程:
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 }
看看效果:
这下就非常类似我们的下载过程了!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。