进度条
回车\r&&换行\n
回车,换行是两个不同的概念
回车表示光标回到所在行的行首;换行表示从光标所在行直接跳到下一行,相对位置不发生变化
行缓冲区概念
观察下面两段代码执行的结果
1 #include<stdio.h> 2 #include<unistd.h> 3 int main() 4 { 5 int i =10; 6 while(i) 7 { 8 printf("剩余时间:%2d\r",i); 9 i--; 10 sleep(1); 11 } 12 return 0; 13 }
1 #include<stdio.h> 2 #include<unistd.h> 3 int main() 4 { 5 int i =10; 6 while(i) 7 { 8 printf("剩余时间:%2d\n",i); 9 i--; 10 sleep(1); 11 } 12 return 0; 13 }
两段代码唯一的区别就是输出打印时第一个是回车打印,第二个时是换行打印结果却相差很大,原因便是:两种打印的缓冲区不同,第一个是打印到缓冲区,第二个是打印到行缓冲区,缓冲区的区别之后再进行学习,这里只作为了解
进度条代码
首先一个概念,凡是能显示到显示器上的都是字符
根据上面的学习,在进度条的打印中一定是使用回车打印,不过呢,上面的代码还是有些问题的。进度条肯定是在原地打印,总不能随着进度的加载,打印也冲页首打印到页尾。所以,在每次打印之后重新刷新输出,便可解决这个问题
代码分为四个文件:Makefile,源文件,头文件,进度条文件
头文件
1 #pragma once 2 #include<stdio.h> 3 #include<string.h> 4 #include<unistd.h> 5 6 #define NUM1 5 7 #define NUM2 100 8 9 extern void Process();//函数声明
源文件
1 #include"Process.h" 2 int main() 3 { 4 Process(); 5 return 0; 6 }
Makefile
1 Process:test.c Process.c 2 gcc test.c Process.c -o Process 3 .PHONY:clean 4 rm -f Process
进度条文件
1 #include"Process.h" 2 char style[NUM1]={'-','.','#','>','+'}; 3 void Process() 4 { 5 int i=0; 6 char ch[NUM2]; 7 memset(ch,'\0',sizeof(ch)); 8 //加载符号 9 const char*label="|\\_/"; 10 11 while(i<=100) 12 { 13 printf("[%-100s][%d%%][%c]\r",ch,i,label[i%4]); 14 fflush(stdout); 15 ch[i++]=style[2]; 16 //休眠50000毫秒 17 usleep(50000); 18 19 } 20 21 printf("\n"); 22 }