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

2024-03-25 1438阅读

温馨提示:这篇文章已超过400天没有更新,请注意相关的内容是否还可用!

🕺作者: 主页

我的专栏
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从练气到飞升》No.07 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                            
       printf("[%-100s][%d%%][%c]\r", bar, cnt, lable[cnt%len]);
       //%-100s:预留100个空间左对齐
       //%%:输出%,也可以使用\%
       //\r:把光标移到开始位置                
       fflush(stdout);//清空缓存区           
       bar[cnt++]=BODY;//将cnt所在位置设置为”BODY"          
       if(cnt
    download(100000);
    return 0; 
}

    int total = 1000; // 1000MB
    int curr = 0;     // 0MB
    while(curr 
        // 模拟进行着某种下载的任务, 我
        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;
}

    if(rate  

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  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  

效果如下:

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

后记

本篇我们讲述了如何在Linux上实现一个进度条,并对其进行了美化,但是我们的目的是通过做项目来把之前所学的相关知识串起来,我并没有对它进行过多的讲解,因为它本身并不难,难的是你在linux系统上编程的过程,但它也是最重要的!

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]