【Linux】7:第一个系统程序-进度条
2026/7/6 6:42:40 网站建设 项目流程

目录

一、补充回车和换行知识

二:行缓冲区

三、倒计时程序

四、进度条程序

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 }

4.2.5 运行

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询