目录
[4.1 version1](#4.1 version1)
[4.1.1 makefile文件](#4.1.1 makefile文件)
[4.1.2 process.h文件](#4.1.2 process.h文件)
[4.1.3 process.c文件](#4.1.3 process.c文件)
[4.1.4 main.c文件](#4.1.4 main.c文件)
[4.1.5 运行](#4.1.5 运行)
[4.2 version2](#4.2 version2)
[4.2.1 makefile文件](#4.2.1 makefile文件)
[4.2.2 process.h文件](#4.2.2 process.h文件)
[4.2.3 process.c文件](#4.2.3 process.c文件)
[4.2.4 main.c文件](#4.2.4 main.c文件)
[4.2.5 运行](#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文件
cpp
1 #pragma once
2
3 #include<stdio.h>
4
5 void process_v1();
4.1.3 process.c文件
cpp
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文件
cpp
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文件
cpp
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文件
cpp
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文件
cpp
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 }
4.2.5 运行
