【Linux】7:第一个系统程序-进度条

目录

一、补充回车和换行知识

二:行缓冲区

三、倒计时程序

四、进度条程序

[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 运行

相关推荐
枳实-叶1 小时前
【Linux驱动开发】第23天:spi_driver 的 probe / remove 函数实现规范
linux·驱动开发·c#
李子琪。2 小时前
云计算虚拟化技术全解析:从理论到实践
linux·centos·云计算
wuminyu2 小时前
markword在高并发场景下变化剖析
java·linux·c语言·jvm·c++
Cloud_Shy6182 小时前
Linux 用户管理知识与应用实践(二:用户相关命令与示例)
linux·运维·服务器·测试用例
小生不才yz2 小时前
Shell脚本精读 · S08-03 | 脚本模块化:`source` 与多文件组织
linux
碎碎念_4922 小时前
ACL包过滤、NAT技术、广域网协议
服务器·网络·安全·acl·nat
想你依然心痛2 小时前
AtomCode在算法竞赛中的实战体验:LeetCode周赛辅助编程
linux·算法·leetcode
24计网1王仔寿2 小时前
Linux 系统运维全栈学习路线|从 Shell 脚本到容器云 OpenStack 完整学习指南
linux·学习·openstack
vortex52 小时前
Shell 命令执行知识体系全景解析
linux·运维·bash·shell·命令行