目录一、补充回车和换行知识二行缓冲区三、倒计时程序四、进度条程序4.1 version14.1.1 makefile文件4.1.2 process.h文件4.1.3 process.c文件4.1.4 main.c文件4.1.5 运行4.2 version24.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 version14.1.1 makefile文件4.1.2 process.h文件1 #pragma once 2 3 #includestdio.h 4 5 void process_v1();4.1.3 process.c文件1 #include process.h 2 #includestring.h 3 #includeunistd.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 lenstrlen(lable); 14 int cnt0; 15 while(cnt100) 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 #includestdio.h 4 5 void FlushProcess(double total,double current); 6 void process_v1();4.2.3 process.c文件1 #include process.h 2 #includestring.h 3 #includeunistd.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 lenstrlen(label); 15 static int cnt0; 16 //不需要自己循环循环代码在下载里面 17 //填充# 18 int num(int)(current*100/total); 19 for(int i0;inum;i) 20 { 21 buffer[i]STYLE; 22 } 23 double ratecurrent/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 lenstrlen(lable); 36 int cnt0; 37 while(cnt100) 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 total1024.0; 5 double speed1.0; 6 7 void DownLoad() 8 { 9 double current0; 10 while(currenttotal) 11 { 12 FlushProcess(total,current); 13 //下载代码 14 usleep(3000); //充当下载数据 15 currentspeed; 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 }4.2.5 运行