《Linux从练气到飞升》No.07 Linux第一个小程序-进度条的实现

这篇具有很好参考价值的文章主要介绍了《Linux从练气到飞升》No.07 Linux第一个小程序-进度条的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux
菜鸟刷题集

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

前言

前面几章我们讲述了Linux指令、权限管理、编辑器、编译器、软件包管理器、自动化管理工具,也写了简单的”Hello World“程序,但是没有实现过复杂一点的程序,光说不练假把式,今天就带大家来做一个小项目–进度条。

搭建框架

在写代码之前,我们先把文件先建好。

vim main.c
vim process.c
vim process.h
vim makefile

书写代码

在写代码要先讲一个知识点。

1.回车换行
在我们日常使用回车键时,是否注意到,当我们按下回车键,也就是\n,光标就会换到第二行的开始,其实这里面有两个动作,换行和把光标设置到行开始,在C语言中可用\r来把光标换到开始位置
我们来借此写个小demo:倒计时

void download()
{
	int cnt=10;
	while(cnt!=0)
	{
		printf("%-2d\r",cnt);
		fflush(stdout);
		cnt--;
		sleep(1);
	}
	printf("\n");
}

效果如下:
《Linux从练气到飞升》No.07 Linux第一个小程序-进度条的实现,《探秘Linux》,linux,小程序,运维,服务器,开发语言

第一版

我们最终要实现这个效果:
《Linux从练气到飞升》No.07 Linux第一个小程序-进度条的实现,《探秘Linux》,linux,小程序,运维,服务器,开发语言
我们前面讲了\r可以把光标移到行始,所以在我们输出缓存字符的时候,每一次都移到一开始的位置,随着缓存字符的增多,来实现进度条的效果。
代码如下:
process.c

#include"process.h"                                                                                                            
const char *lable="|/-\\";//通过循环实现一个转动的效果                                                                                                     
char bar[NUM];                                                                                                                 
                                                                                                                               
void download(int speed)                                                                                                       
{                                                                                                                              
    char bar[NUM];//使用数组来存储”缓存字符“                                                                                                             
    memset(bar,'\0',sizeof(bar));//初始化                                                                                              
    int len =strlen(lable);                                                                                                    
    int cnt=0;                                                                                                                 
    while(cnt<=TOP)//设置终止条件                                                                                                            
    {                                                                                                                          
       printf("[%-100s][%d%%][%c]\r", bar, cnt, lable[cnt%len]);
       //%-100s:预留100个空间左对齐
       //%%:输出%,也可以使用\%
       //\r:把光标移到开始位置                                                               
       fflush(stdout);//清空缓存区                                                                                                         
       bar[cnt++]=BODY;//将cnt所在位置设置为”BODY"                                                                                                        
       if(cnt<100)bar[cnt]=RIGHT;//设置>                                                                                              
       usleep(speed);//控制进度条的速度,单位是微秒                                                                                                      
    }                                                                                                                          
    printf("\n");                                                                                                              
}               

main.c

#include "process.h"

int main() 
{
    download(100000);
    return 0; 
}

process.h

#pragma once
#include<stdio.h>
#include <unistd.h>
#include<string.h>

#define NUM 102
#define TOP 100
#define BODY '='
#define RIGHT '>'

extern void download(int speed);

makefile

process:process.c main.c  
    gcc -o $@ $^                                                                                                               
  
.PHONY:clean  
  
clean:   
    rm -f process   

通过注释,应该可以清楚明白代码的实现原理,但是进度条该怎么用呢?这是一个问题,下面我们来模拟一下使用场景,只需要再修改一下代码即可。

第二版

参考代码注释理解

main.c

#include "processBar.h"


typedef void (*callback_t)(int); // 函数指针类型

// 模拟一种安装或者下载
void downLoad(callback_t cb)
{
    int total = 1000; // 1000MB
    int curr = 0;     // 0MB
    while(curr <= total)
    {
        // 模拟进行着某种下载的任务, 我
        usleep(50000);  // 模拟下载花费的时间
        int rate = curr*100/total; // 更新进度

        cb(rate); // 通过回调,展示进度

        curr += 10;     // 循环下载了一部分
    }
    printf("\n");
}

int main()
{
    printf("donwnload 1: \n");
    downLoad(processbar);
    initbar();
    printf("donwnload 2: \n");
    downLoad(processbar);
    initbar();
    printf("donwnload 3: \n");
    downLoad(processbar);
    initbar();
    printf("donwnload 4: \n");
    downLoad(processbar);
    initbar();
    return 0;
}

processBar.h

#pragma once

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <unistd.h>

#define NUM 102
#define TOP 100
#define BODY '='
#define RIGHT '>'


extern void processbar(int rate);
extern void initbar();

processBar.c

#include "processBar.h"


const char *lable="|/-\\";
char bar[NUM];

// 是如何被调用的
void processbar(int rate)
{
    if(rate < 0 || rate > 100) return;

    int len = strlen(lable);
    printf("[%-100s]""[%d%%][%c]\r", bar, rate, lable[rate%len]); // 没有\n,就没有立即刷新,因为显示器模式是行刷新
    fflush(stdout);
    bar[rate++] = BODY;
    if(rate < 100) bar[rate] = RIGHT;
}

void initbar()
{
    memset(bar, '\0', sizeof(bar));
}

makefile

processbar:processBar.c main.c
	gcc -o $@ $^
.PHONY:clean
clean:
	rm -f processbar

效果是一样的,看到这里,我相信你对实现一个进度条已经非常了解了,但是有没有觉得它有点不好看,那么我们再来优化一下。

第三版

怎么修改?这里要了解一下怎么让编译器输出颜色,可参考这篇文章
http://t.csdn.cn/O2T8F

只需修改processBar.c文件即可

如下:

#include "processBar.h"


const char *lable="|/-\\";
char bar[NUM];

// 是如何被调用的
void processbar(int rate)
{
    if(rate < 0 || rate > 100) return;

    int len = strlen(lable);
    printf("\033[38;2;128;0;128m\033[48;2;255;255;255m[%-100s][%d%%][%c]\033[m\r", bar, rate, lable[rate % len]);
    fflush(stdout);
    bar[rate++] = BODY;
    if(rate < 100) bar[rate] = RIGHT;
}

void initbar()
{
    memset(bar, '\0', sizeof(bar));
}

效果如下:
《Linux从练气到飞升》No.07 Linux第一个小程序-进度条的实现,《探秘Linux》,linux,小程序,运维,服务器,开发语言

后记

本篇我们讲述了如何在Linux上实现一个进度条,并对其进行了美化,但是我们的目的是通过做项目来把之前所学的相关知识串起来,我并没有对它进行过多的讲解,因为它本身并不难,难的是你在linux系统上编程的过程,但它也是最重要的!文章来源地址https://www.toymoban.com/news/detail-627648.html

到了这里,关于《Linux从练气到飞升》No.07 Linux第一个小程序-进度条的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 《Linux从练气到飞升》No.01 Linux常用指令

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!! 当涉及到Linux系统管理和开发,了解常见的Linux指

    2024年02月14日
    浏览(44)
  • 《Linux从练气到飞升》No.13 Linux进程状态

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!! 前面我们讲述了进程的基本概念以及如何描述、组

    2024年02月12日
    浏览(52)
  • 《Linux从练气到飞升》No.15 Linux 环境变量

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

    2024年02月12日
    浏览(61)
  • 《Linux从练气到飞升》No.20 Linux进程替换

     🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞

    2024年02月10日
    浏览(54)
  • 《Linux从练气到飞升》No.02 Linux权限管理

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!! 在讲述Linux权限管理之前,我们要了解什么是权限

    2024年02月14日
    浏览(40)
  • 《Linux从练气到飞升》No.12 Linux进程概念

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!! 本篇我们将正式进入Linux的世界,首先先要讲的就

    2024年02月13日
    浏览(49)
  • 《Linux从练气到飞升》No.22 Linux 基础IO

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

    2024年02月07日
    浏览(45)
  • 《Linux从练气到飞升》No.23 Linux 进程间通信

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

    2024年02月08日
    浏览(39)
  • 《Linux从练气到飞升》No.24 Linux中的信号

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

    2024年02月08日
    浏览(38)
  • 《Linux从练气到飞升》No.16 Linux 进程地址空间

    🕺作者: 主页 我的专栏 C语言从0到1 探秘C++ 数据结构从0到1 探秘Linux 菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇 码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

    2024年02月12日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包