Linux下的第一个小程序——进度条

2023-09-21 21:16:52

目录

​编辑

一,进度条的第一个版本

1.准备工作

2.写Makefile文件

 3.开始构建进度条

1. process.h文件

2. process.c文件

3.main.c文件

二,进度条的第二个版本

1.为什么还要写第二个版本?

2.如何升级?

3.升级代码

1.搭建场景


一,进度条的第一个版本

1.准备工作

在写进度条之前,我们得把前期的准备工作做好。这些准备工作便是准备好三个文件,这三个文件便是:main.c process.c process.h。如下:

2.写Makefile文件

在前面的学习中我们有学习到使用Makefile文件来自动化构建项目,所以在这里我们便可以用起来。首先便是创建Makefile/makefile文件。注意文件名必须是前面两个名字中的一个。所以我们创建Makefile/makefile文件如下:

然后我们便使用vim打开Makefile文件,开始写我们的代码,代码如下:

process:main.c process.c
  2   @gcc @$^ -o $@
  3 .PHONY:clean
  4 clean:                                                                                                                                                                                 
  5   @rm -f process

这个文件便是我们的Makefile文件,相信大家能看懂。

 3.开始构建进度条

1. process.h文件

在这个文件里头我们要做的便是将我们在写代码时需要使用到的头文件和一些宏定义放入到该文件中。所以我们在写进度条时首先要想明白的便是我们该如何构建进度条这个代码?如何构建呢?不管如何构建我们都要使用stdio.h这个头文件。因为在写进度条时会有需要有休眠的操作所以就得有usleep的头文件——unistd.h。剩下的便是一些宏定义和函数声明了,我的头文件代码如下:

 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 #define STIME 12345//休眠时间,以微妙为单位
  5 #define MAX_SIZE 100//进度条的最大长度
  6 #define STYLE '#'//进度条的风格
  7 void process_v1();//函数声明
2. process.c文件

在这个文件里头我们要写的便是进度条的实现逻辑,但是我们的先来看看我们的进度条长啥样?先来看看我们的进度条:

这个进度条里面有啥呢?首先便是一个字符串,这个字符串有一百个字符,然后这个进度条还有一个表示进度的百分率的东西,还有一个旋转光标。

我们该如何实现这些功能呢?代码如下:

 #include"process.h"
    2 void process_v1()
    3 {
    4   int rate = 0;//进度表示数
    5   char bar[MAX_SIZE] = {0};//进度条,刚开始时初始化为0,因为时字符0所以不会显示出来。
W>  6   char* str = "\\|/-";//表示旋转光标
    7   int num = strlen(str);//计算str的长度
    8   while(rate<=MAX_SIZE)                                                                                                                                                              
    9   {
   10       printf("[%-100s][%d%%][%c]\r",bar,rate,str[rate%num]);//打印,记得使用\r表示回车
   11       usleep(STIME);//休眠
   12       fflush(stdout);//刷新
   13       bar[rate++] = STYLE;//给字符串bar添加字符并且让rate++
   14 
   15   }
   16   printf("\n");
   17 }

在写完这个代码以后我们的第一个版本的进度条便完成了。

3.main.c文件

main.c文件的实现极其简单,因为这个文件的功能十分的单一。在这个文件里需要做的便是写一个main函数调用我们的void process()函数便可以了。所以这个代码书写如下:

#include"process.h"
int main()
{
  process();
  return 0;
}

写完这个文件里的内容以后我们再make并执行一下便可以生成一个进度条如下:

到此我们的第一个版本的进度条便写完了,完美撒花!!!

二,进度条的第二个版本

1.为什么还要写第二个版本?

在这里解释一下为什么需要写第二个版本的进度条呢?这是因为我们的进度条的使用场景是在下载的过程中使用的,要是写成第一种版本的进度条我们就不好调用了。也实现不了在下载的场景下使用的功能。所以我们得将这个版本的进度条升级一番。

2.如何升级?

这个进度条的升级说来也容易,但是不好说,还是来看看我写的代码吧。

3.升级代码

1.搭建场景

这个场景的搭建是在main.c文件下面,搭建的场景是一个下载的场景。搭建场景如下:

void download()
     {
      int total = 0;//这个total就表示当前下载的进度
      int target = TARGET;//这是我们要下载的目标文件的总大小
      while(total<=target)                                                                                                                                                                 
      {
         total+=DSIZE;//每次下载的大小
       process_v2(total*100/target);
   
       usleep(STIME);//休眠时间
     }
     printf("\n");
   }

在这个场景下我们的版本升级代码如下:

void process_v2(int rate)                                                                             
   20 {                                                                                            
   21                                                                                                          
   22   static  char bar[MAX_SIZE] = {0};                                                                    
W> 23   char* str = "\\|/-";                                                                       
   24   int num = strlen(str);                                                               
   25   if(rate>=0&&rate<=100)                                                               
   26   {                                                                                    
   27     printf("[%-100s][%d%%][%c]\r",bar,rate,str[rate%num]);                                                                                                                           
   28     bar[rate] = STYLE;                                                                 
   29                                                                                        
   30     usleep(STIME);                                                                     
   31     fflush(stdout);                                                                    
   32                                                                                        
   33   }                                                                                    
   34                                                                                        
   35                                                                                        
   36 }         

其实这个代码的升级也没有多少,这里的改进便是将原来放到函数里的循环给放到外面了。

更多推荐

Jtti:ubuntu如何扩展磁盘空间

在Ubuntu上扩展磁盘空间通常涉及到对文件系统和分区进行调整。以下是一些常见的方法来扩展磁盘空间:注意:在执行任何磁盘扩展操作之前,请务必备份您的数据,以防意外发生。使用GParted(图形界面方法):GParted是一个强大的分区编辑工具,可以用于扩展磁盘空间。首先,您需要确保您的虚拟机或物理机已经添加了额外的磁盘

软件设计模式系列之九——桥接模式

1模式的定义桥接模式是一种结构型设计模式,它用于将抽象部分与其实现部分分离,以便它们可以独立地变化。这种模式涉及一个接口,它充当一个桥,使得具体类可以在不影响客户端代码的情况下改变。桥接模式将继承关系转化为组合关系,从而减少类之间的紧密耦合度,使得系统更加灵活和可扩展。桥接模式的核心思想是将系统中的多个维度的变化解耦,

好物周刊#8:开源镜像站

村雨遥的好物周刊,记录每周看到的有价值的信息,主要针对计算机领域,每周五发布。一、项目1.ChatGPTWeb用Express和Vue3搭建的ChatGPT演示网页,支持双模型,提供了两种非官方ChatGPTAPI方法。ChatGPTAPI使用gpt-3.5-turbo通过OpenAI官方API调用ChatGPTCha

前后端分离管理系统day01---Springboot+MybatisPlus

目录目录软件基础知识一创建后端项目注意:删除多余项创建测试类二加入mybatis-plus依赖支持1.加入依赖码2.创建数据库实例/创建用户表/插入默认数据创建数据库实例创建表插入数据3.配置yml文件注意:wms01必须是数据库的名字,后端手动配置端口8090,防止前端访问8080时和后端冲突4.编写测试代码①创建e

RabbitMQ生产故障问题分析

1.问题引发由某个服务BI-collector-xx队列出现阻塞,影响很整个rabbitMQ集群服务不可用,多个应用MQ生产者服务出现假死状态,系统影响面较广,业务影响很大。当时为了应急处理,恢复系统可用,运维相对粗暴的把一堆阻塞队列信息清空,然后重启整个集群。在复盘整个故障过程中,我心中有不少疑惑,至少存在以下几个问

GPT引领前沿与应用突破之GPT4科研实践技术与AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具,不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域:1、编程建议和示例代码:无论你使用的编程语言是Python、R、MATLAB还是其他语言,都可以为你提供相关的代码示例。2、数据可视化:生成各种类型的数据可视化图表,如折线图、柱状图、散点图、饼图、热力图等。提

Python中两个最常用的单元测试框架unittest和pytest

这篇文章的主要目的是讨论Python中两个最常用的单元测试框架unittest和pytest,它们的优缺点以及在何时选择哪个框架。PythonunittestvsPytest在编写任何软件时,我们必须在开发过程中保持错误检查的过程。这确保了一旦软件达到发布阶段,在使用过程中遇到的错误数量最小。Python也有各种测试框

北京君正应用案例:联想新款Yoga Book 9i亮相 CES

国际消费电子展(CES),被誉为年度消费电子行业“风向标”。在今年CES2023上,联想旗下多款创新产品正式亮相,带来最前沿的趋势与技术体验。特别是新款YogaBook9i的发布,采用了双面13英寸OLED屏的设计,可以一起用作大型平板电脑,也可以与可连接的蓝牙键盘配对,用作双屏笔记本电脑。YogaBook9i能够帮助

Vue2+ElementUI 静态首页案例

源码<template><divclass="app-containerhome"><el-rowtype="flex"justify="space-around"class="row-bg"><el-cardclass="box-cardcardDiv1"><el-col:span="5"><divclass="bo

第一百五十回 自定义组件综合实例:游戏摇杆一

文章目录概念介绍实现方法示例代码我们在上一章回中介绍了自定义组件相关的内容,本章回中将综合使用这些内容自定义游戏摇杆组件.闲话休提,让我们一起TalkFlutter吧。概念介绍我们介绍的游戏摇杆就是一个内层的小圆嵌套一个外层的大圆,大圆的位置不变,小圆只能在大圆所在的范围进行移动,它移动的角度是360度,因此在游戏中使

LeetCode算法心得——连续数组(前缀和+HashMap)

大家好,我是晴天学长,公式的巧妙化简加上hashmap的灵活应用,需要的小伙伴可以关注支持一下哦!后续会继续更新的。1).连续数组给定一个二进制数组nums,找到含有相同数量的0和1的最长连续子数组,并返回该子数组的长度。示例1:输入:nums=[0,1]输出:2说明:[0,1]是具有相同数量0和1的最长连续子数组。示

热文推荐