目录
一、补充回车和换行知识
二:行缓冲区
三、倒计时程序
四、进度条程序
4.1 version1
4.1.1 makefile文件
4.1.2 process.h文件
4.1.3 process.c文件
4.1.4 main.c文件
4.1.5 运行
4.2 version2
4.2.1 makefile文件
4.2.2 process.h文件
4.2.3 process.c文件
4.2.4 main.c文件
4.2.5 运行
一、补充回车和换行知识
换行指的是从当前这一行,到下一行的当前位置,如下所示:
回车指的是到本行的开头位置,如下所示:
回车换行:如下所示:
换行是\n,回车是\r.
\r\n表示回车换行。在我们写的c语言代码中的\n,它指的是\r\n,也就是回车换行,编译器处理了一下。
二:行缓冲区
我们来看如下代码,我们先打印一个字符串,然后在睡眠3秒,执行之后,我们发现会先输出一个字符串,然后等待3秒之后程序就结束了。
现在我们将\n给去掉,然后运行,如下所示:
我们发现运行之后,是先睡眠3秒,然后在打印出hello world的,这是为什么呢?我们写的程序应该是顺序执行的,应该是先打印出hello world,然后睡眠3秒,结束程序的。
这是因为,我们打印hello world是先被输出到缓冲区中了,然后再次睡眠3秒结束程序,当程序结束之后,会自动刷新缓冲区,将缓冲区的内容输入到屏幕。
那为什么第一个程序会先打印出hello world呢?这是因为\n会刷新缓冲区。
如果想要让不带\n的字符串立马刷新到屏幕呢?我们可以使用fflush来刷新输出缓冲区,如下所示:
三、倒计时程序
四、进度条程序
4.1 version1
4.1.1 makefile文件
4.1.2 process.h文件
1 #pragma once 2 3 #include<stdio.h> 4 5 void process_v1();4.1.3 process.c文件
1 #include "process.h" 2 #include<string.h> 3 #include<unistd.h> 4 5 #define NUM 101 6 #define STYLE '#' 7 8 void process_v1() 9 { 10 char buffer[NUM]; 11 memset(buffer,0,sizeof(buffer)); 12 const char* lable="|/-\\"; 13 int len=strlen(lable); 14 int cnt=0; 15 while(cnt<=100) 16 { 17 printf("[%-100s][%d%%][%c]\r",buffer,cnt,lable[cnt%len]); 18 fflush(stdout); 19 buffer[cnt]=STYLE; 20 usleep(10000); 21 cnt++; 22 } 23 printf("\n"); 24 }4.1.4 main.c文件
1 #include "process.h" 2 3 int main() 4 { 5 process_v1(); 6 return 0; 7 } ~4.1.5 运行
4.2 version2
在上面的我们进度条的代码是无法使用的,例如我们下载一个文件,我们是运行下载程序,还是进度条程序呢?一个进度条,是需要结合场景的,一边下载,一边更新进度条。
4.2.1 makefile文件
4.2.2 process.h文件
1 #pragma once 2 3 #include<stdio.h> 4 5 void FlushProcess(double total,double current); 6 void process_v1();4.2.3 process.c文件
1 #include "process.h" 2 #include<string.h> 3 #include<unistd.h> 4 5 #define NUM 101 6 #define STYLE '#' 7 8 //version2 9 void FlushProcess(double total,double current) 10 { 11 char buffer[NUM]; 12 memset(buffer,0,sizeof(buffer)); 13 const char* label="|/-\\"; 14 int len=strlen(label); 15 static int cnt=0; 16 //不需要自己循环,循环代码在下载里面 17 //填充# 18 int num=(int)(current*100/total); 19 for(int i=0;i<num;i++) 20 { 21 buffer[i]=STYLE; 22 } 23 double rate=current/total; 24 cnt%=len; 25 printf("[%-100s][%.1lf%%][%c]\r",buffer,rate*100,label[cnt]); 26 cnt++; 27 fflush(stdout); 28 } 29 //version1 30 void process_v1() 31 { 32 char buffer[NUM]; 33 memset(buffer,0,sizeof(buffer)); 34 const char* lable="|/-\\"; 35 int len=strlen(lable); 36 int cnt=0; 37 while(cnt<=100) 38 { 39 printf("[%-100s][%d%%][%c]\r",buffer,cnt,lable[cnt%len]); 40 fflush(stdout); 41 buffer[cnt]=STYLE; 42 usleep(10000); 43 cnt++; 44 } 45 printf("\n"); 46 }4.2.4 main.c文件
1 #include "process.h" 2 #include <stdio.h> 3 #include <unistd.h> 4 double total=1024.0; 5 double speed=1.0; 6 7 void DownLoad() 8 { 9 double current=0; 10 while(current<=total) 11 { 12 FlushProcess(total,current); 13 //下载代码 14 usleep(3000); //充当下载数据 15 current+=speed; 16 } 17 printf("\ndownload %.2lfMB Done\n",current); 18 } 19 int main() 20 { 21 DownLoad(); //下载软件1 22 DownLoad(); //下载软件2 23 DownLoad(); //下载软件3 24 DownLoad();//下载软件4 25 DownLoad();//下载软件5 26 return 0; 27 }