返回顶部
首页 > 资讯 > 操作系统 >【Linux旅行记】进度条小程序
  • 227
分享到

【Linux旅行记】进度条小程序

linux运维小程序c语言 2023-08-16 15:08:03 227人浏览 安东尼
摘要

文章目录 一、预备知识1.1回车换行1.2缓冲区 二、倒计时三、进度条3.1普通版本源代码3.2高级版本源代码 🍀小结🍀 🎉博客主页:小智_x0___0x_ &#

在这里插入图片描述
在这里插入图片描述

🎉博客主页:小智_x0___0x_

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

🎉系列专栏:Linux入门到精通

🎉代码仓库:小智的代码仓库


一、预备知识

1.1回车换行

我们一般意义上的回车换行是两个概念,一般我们在C语言上的\n的作用是回车+换行,他把两个操作都做了,但是\转义字符也有别的的作用,我们一般回车是回车,换行是换行,两个是不同的概念。回车是指讲光标移动到当前行的最左侧开始位置,换行指的是光标水平方向保持不变,向下平移一行,C语言中有一个\r就是实现回车功能。
在这里插入图片描述

我们平时用的键盘上面有一个Enter的按键,这个按键就是实现了我们的回车+换行的作用。

1.2缓冲区

我们先来看一段代码:

#include "processBar.h"#include int main(){    printf("hello world\n");      sleep(2);        return 0;                     }  

这个程序是输出一个hello world 然后再让程序休眠2秒,这里的sleep函数是系统函数功能是让程序休眠指定时间,我们可以通过man 3 sleep手册来查看sleep函数的使用方法。

在这里插入图片描述

我们来运行这个代码来看看效果:
在这里插入图片描述

这里可以看到的现象是,程序先完成了打印hello world再休眠两秒钟。

我们再来改改代码:

#include "processBar.h"#include int main(){    printf("hello world");       sleep(2);    return 0;}

这次我们把\n去掉,此时程序会是怎么样的呢,先打印还是先休眠,我们一起来验证一下:

在这里插入图片描述

可以看到我们把\n去掉之后程序是先休眠了两秒,接着再在显示器上打印出hello world,这次没有换行符,所以bash命令行就会紧接在hello world的后面。

那么事实真的是这样的嘛?

我们可以来想一想,一个C语言程序是严格按照代码顺序从上往下依次执行的,不管怎样都是这样,肯定是先执行打印printf在进行sleep休眠2秒,但是此时又有一个疑问了,为什么我们printf的内容没有显示出来呢?在我sleep期间hello world在哪里?

一定被保存起来了,那么要保存就一定需要内存空间,这里其实就是保存在来我们的缓冲区里面,这里的缓冲区是由C语言维护的一段内存

所以当程序执行结束的时候才会将缓冲区中的内容刷新出来。

那我们要强制刷新呢?

这里我们就要知道一个C语言程序运行会默认帮我们打开这三个流:

  • stdin - - - -标准输入流(键盘)
  • stdout - - - - 标准输出流(显示器)
  • stderr - - - -标准错误流(显示器)

在我们平时使用文件操作的时候打开一个文件也是用的FILE *类型来打开文件。

那么我们要强制刷新就要用到这个函数fflush

在这里插入图片描述

这里刚好就是接收FILE* 类型。

具体操作:

#include "processBar.h"#include int main(){    printf("hello world");    fflush(stdout);    sleep(2);    return 0;}

我们其实打印出的数据是往stdout中打印的,所以我们在printf后面紧接着一个fflush来强制刷新。

我们来运行看看现象:

在这里插入图片描述

可以看到这次我们是先显示出了hello warld再休眠两秒,bash的命令行才刷新出来。

总结:

  • \n可以刷新缓冲区
  • fflush可以强制刷新缓冲区
  • 程序结束可以刷新缓冲区

二、倒计时

有了上面的基础我们可以简单的来实现一个倒计时:

#include "processBar.h"#include int main(){    int cnt=10;//定义倒计时时间    while(cnt>=0)    {        printf("%-2d\r",cnt);//%-2d 表示以两个字符位输出并以左对齐方式输出  `\r`表示只回车不换行        fflush(stdout);//强制刷新缓冲区        cnt--;        sleep(1);//程序休眠1s    }    printf("\n");    return 0;}

我们再来看看效果:

在这里插入图片描述

在这段代码中,%-2d\r的作用是实现倒计时效果。%-2d表示以两个字符位输出并以左对齐方式输出,%d是输出整数的占位符。\r表示回车到行首,即光标移到行首,而不换行。

因此,每次循环时,数字会被输出并覆盖上一次输出的数字,从而实现倒计时的效果。由于使用了\r回车到行首,所以数字输出在同一行上,不会换行。

另外,fflush(stdout)强制刷新缓冲区是为了确保每次输出都能够立即显示在屏幕上,而不是留在缓冲区中等待下一次输出。sleep(1)函数是让程序休眠1秒钟,以便实现倒计时效果。

三、进度条

设计思路:

  1. 确定进度条的显示方式,例如使用字符 ‘#’ 表示进度条的进度。
  2. 确定进度条的长度,例如设定进度条长度为100个字符。
  3. 计算进度条的进度,例如已完成任务的百分比为 50%,则进度条应该显示50个 ‘#’ 字符。
  4. 每次更新进度条时,先将光标移动到行首,然后输出当前进度条的状态,再将光标移回到行首,以便下一次更新。
  5. 可以使用定时器或者其他方式控制进度条的更新速度,例如每隔1秒更新一次进度条。

3.1普通版本源代码

processBar.h

#pragma once #include#define NUM 102 // 进度条长度#define TOP 100 // 进度条最大值#define BODY '=' // 进度条已完成部分的字符#define RIGHT '>' // 进度条右边界的字符// 进度条函数的声明extern void processbar(int speed);

processBar.c

#include "processBar.h"#include #include // 进度条的四种状态,即 |、/、-、\const char *lable="|/-\\";void processbar(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]); // 输出进度条信息        fflush(stdout); // 刷新缓冲区,使得程序能够立即输出        bar[cnt++]= BODY; // 将 BODY 字符加入到进度条数组中,并将当前值加1        if(cnt<100) bar[cnt] = RIGHT; // 当进度条未达到100%时,在进度条的末尾加上 RIGHT 字符,防止有边界越界        usleep(speed); // 程序休眠一段时间,以控制进度条的更新速度    }    printf("\n"); // 输出提示信息,任务已完成}

main.c

#include "processBar.h"#include int main(){    processbar(100000);        return 0;}

代码效果:
在这里插入图片描述

3.2高级版本源代码

在现实中进度条是表示我们下载某些文件的进度,所以进度不是由我们自己来决定的需要,所以我们需要写一个进度条接口来接收当前下载的百分比,进而通过调用函数来打印出当前的进度。

plus版本:

processBar.h

#pragma once #include#define NUM 102 // 进度条长度#define TOP 100 // 进度条最大值#define BODY '=' // 进度条已完成部分的字符#define RIGHT '>' // 进度条右边界的字符extern void processbar(int rate);

processBar.c

#include "processBar.h"#include #include // 进度条的四种状态,即 |、/、-、\const char *lable="|/-\\";// 存储进度条的字符数组,初始化为0char bar[NUM]={0};void processbar(int rate){    if(rate < 0 || rate > 100) return; // 判断进度条的值是否在合法范围内    int len = strlen(lable); // 计算进度条状态的长度    printf("[%-100s][%d%%][%c]\r",bar,rate,lable[rate%len]); // 输出进度条信息    fflush(stdout); // 刷新缓冲区,使得程序能够立即输出    bar[rate++]= BODY; // 将 BODY 字符加入到进度条数组中,并将当前值加1    if(rate<100) bar[rate] = RIGHT; // 当进度条未达到100%时,在进度条的末尾加上 RIGHT 字符,防止有边界越界添加}

main.c

#include "processBar.h"#include int main(){        int total = 1000;//要下载的总进度    int curr = 0;//初始进度    while(curr <= total)    {         processbar(curr*100/total);         curr+=10;//每次下载10         usleep(50000);//模拟下载花费的时间    }    printf("\n");return 0;}

plusplus版本:

processBar.h

#pragma once #include#define NUM 102 // 进度条长度#define TOP 100 // 进度条最大值#define BODY '=' // 进度条已完成部分的字符#define RIGHT '>' // 进度条右边界的字符// 进度条函数的声明extern void processbar(int rate);extern void initbar();

processBar.c

#include "processBar.h"#include #include // 定义了一些控制台输出颜色的宏#define NONE "\033[m"#define RED "\033[0;32;31M"#define GREEN "\033[0;32;32m"#define LIGHT_BLUE "\033[1;34m"#define LIGHT_PURPLE "\033[1;35m"// 进度条的四种状态,即 |、/、-、\const char *lable="|/-\\";// 存储进度条的字符数组,初始化为0char bar[NUM]={0};// 进度条函数的具体实现部分,实现了进度条的显示、刷新、更新等功能void processbar(int rate){    if(rate < 0 || rate > 100) return; // 判断进度条的值是否在合法范围内    if(rate==0) initbar(); // 如果进度条为0,则初始化进度条数组    int len = strlen(lable); // 计算进度条状态的长度    printf("["LIGHT_BLUE"%-100s"NONE"]""[%d%%][%c]\r",bar,rate,lable[rate%len]); // 输出进度条信息,带有颜色    fflush(stdout); // 刷新缓冲区,使得程序能够立即输出    bar[rate++]= BODY; // 将 BODY 字符加入到进度条数组中,并将当前值加1    if(rate<100) bar[rate] = RIGHT; // 当进度条未达到100%时,在进度条的末尾加上 RIGHT 字符,以便显示进度条的右边界}// 初始化进度条数组void initbar(){    memset(bar, '\0', sizeof(bar));}

main.c

#include "processBar.h"#include // 定义了一个函数指针类型 callback_ttypedef 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); // 下载任务1,回调函数为 processbar    printf("donwnload 2: \n");    downLoad(processbar); // 下载任务2,回调函数为 processbar    printf("donwnload 3: \n");    downLoad(processbar); // 下载任务3,回调函数为 processbar    printf("donwnload 4: \n");    downLoad(processbar); // 下载任务4,回调函数为 processbar        return 0;}

上面的代码实现了一个简单的下载任务,并通过回调函数 processbar 实现了下载进度的显示。代码主要分为以下几个部分:

  1. 头文件部分,包含了 stdio.h 头文件和 processBar.h 头文件,以及一些宏定义。

  2. 进度条函数的声明部分,声明了进度条函数 processbar 和初始化进度条数组的函数 initbar

  3. 进度条函数的具体实现部分,实现了进度条的显示、刷新、更新等功能。这部分代码和之前相同。

  4. 初始化进度条数组的函数 initbar 的具体实现部分。这个函数只是简单地将进度条数组清零。

  5. 主函数部分,模拟了四个下载任务,并通过回调函数 processbar 展示下载进度。具体来说,这部分代码主要做了以下几件事情:

    • 调用 downLoad 函数模拟四个下载任务,并将回调函数设置为 processbar

    • 在每个下载任务开始时输出提示信息。

    • 在每个下载任务结束时输出提示信息。

代码运行效果:
在这里插入图片描述

🍀小结🍀

今天我们学习"linux进度条小程序"相信大家看完有一定的收获。种一棵树的最好时间是十年前,其次是现在! 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波💕💕~~~,本文中也有不足之处,欢迎各位随时私信点评指正!
在这里插入图片描述

来源地址:https://blog.csdn.net/xz2935117143/article/details/132121389

--结束END--

本文标题: 【Linux旅行记】进度条小程序

本文链接: https://lsjlt.com/news/371544.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 【Linux旅行记】进度条小程序
    文章目录 一、预备知识1.1回车换行1.2缓冲区 二、倒计时三、进度条3.1普通版本源代码3.2高级版本源代码 🍀小结🍀 🎉博客主页:小智_x0___0x_ &#...
    99+
    2023-08-16
    linux 运维 小程序 c语言
  • Linux新手小程序——进度条
    前言 目录 前言 需要先了解        1.\r和\n                           2.缓冲区 一.理解字符的含义:         学习c语言时,我们可以粗略把字符分为可显字符和控制字符.         ...
    99+
    2023-08-31
    linux c++ c语言 小程序
  • 【Linux取经路】进度条小程序
    文章目录 一、预备知识1.1 回车换行1.2 缓冲区 二、倒计时2.1 注意事项 三、进度条3.1 源代码3.2 代码分析3.2 实际使用场景 一、预备知识 1.1 回车换行 一般意义上的回车换行是两个独立的独立的...
    99+
    2023-08-16
    linux 小程序 运维
  • Linux小程序:倒计时和进度条
    Linux小程序 在Linux中我们实现两个小程序来体会\r和\n的区别,以及缓冲区是什么? 文章目录 Linux小程序前言回车和换行的区别缓冲区 小程序的实现倒计时程序进度条程序 总结 前言 回车和换行的区别 对...
    99+
    2023-08-16
    linux 小程序 进度条 倒计时
  • 【Linux】在Linux上写一个进度条小程序
    👑作者主页:@安 度 因 🏠学习社区:StackFrame 📖专栏链接:Linux 文章目录 一、前言二、理解 '\r' 与 '\n'三、行缓冲1、提出问题2、认识行缓冲3、解...
    99+
    2023-08-19
    linux 运维 服务器 vim 进度条
  • 【Linux】编写第一个小程序:进度条
    文章目录 1. 预备知识1.1 简单认识几个函数1.1.1 sleep()1.1.2 fflush()1.1.3 usleep()1.1.4 memset() 1.2 缓冲区1.3 回车...
    99+
    2024-01-21
    linux c语言 小程序
  • 【闪击Linux系列P7】进度条小程序の深度解剖
    ​​​​​ ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读: YY的《...
    99+
    2023-08-16
    linux vim 运维
  • Linux | 手把手教你写一个进度条小程序
    文章目录 一、前言二、理解 '\r' 与 '\n'1、可显字符与控制字符2、老式键盘 三、缓冲区的概念理解1、五个代码段 + 现象分析2、观察现象,提出问题❓3、行缓冲的概念 + 疑难解...
    99+
    2023-08-31
    linux 运维 服务器
  • 【Linux】从0到1实现一个进度条小程序
    个人主页:🍝在肯德基吃麻辣烫 我的gitee:gitee仓库 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处 文章目录 前言一、理解回车 '\r' 和换行 '\n'二、初步认识缓冲区1. 认识第一个...
    99+
    2023-08-16
    linux 小程序 apache 进度条
  • 微信小程序进度条怎么实现
    这篇文章主要介绍“微信小程序进度条怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序进度条怎么实现”文章能帮助大家解决问题。progress进度条。属性名类型默认值说明percentF...
    99+
    2023-06-26
  • 微信小程序实现环形进度条
    本文实例为大家分享了微信小程序实现环形进度条的具体代码,供大家参考,具体内容如下 index.wxss .circle {   position: absolute;   left:...
    99+
    2024-04-02
  • 微信小程序实现圆心进度条
    本文实例为大家分享了微信小程序实现圆心进度条的具体代码,供大家参考,具体内容如下 一、创建项目结构 打开微信开发者工具创建一个项目, 新建 与 pages 同级目录 componen...
    99+
    2024-04-02
  • 小程序怎么实现流程进度条功能
    今天小编给大家分享一下小程序怎么实现流程进度条功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现小程序流程进度条需求:没...
    99+
    2023-06-26
  • 微信小程序怎样实现下载进度条
    这篇文章主要介绍了微信小程序怎样实现下载进度条,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。效果:progress进度条是微信小程序的组件,...
    99+
    2024-04-02
  • 微信小程序怎么实现环形进度条
    本篇内容主要讲解“微信小程序怎么实现环形进度条”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“微信小程序怎么实现环形进度条”吧!index.wxss.circle { &nbs...
    99+
    2023-07-02
  • 微信小程序怎么实现圆心进度条
    这篇文章主要介绍“微信小程序怎么实现圆心进度条”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序怎么实现圆心进度条”文章能帮助大家解决问题。一、创建项目结构打开微信开发者工具创建一个项目, 新...
    99+
    2023-07-02
  • 微信小程序用canvas实现圆形进度条
    本文实例为大家分享了微信小程序用canvas实现圆形进度条的具体代码,供大家参考,具体内容如下 先放效果图,如下: 1. wxml文件代码如下 对于圆形进度条中间的文字,如果是简单...
    99+
    2024-04-02
  • 微信小程序实现带滑块的进度条
    微信小程序项目需求,要实现一个带滑块并可左右滑动的进度条,看了小程序的文档,发现上面的progress组件无法满足需求,所以我自己写了一个,在这里总结一下。 一、效果图 二、实现逻...
    99+
    2024-04-02
  • Python进度条可视化之监测程序运行速度
    目录前言安装使用方式示例前言 今天和大家分享一个进度条可视化库,它的名字叫做 tqdm ,可以帮助我们监测程序运行的进度,用户只需要封装可迭代对象即可。 安装 通过命令行直接安装。...
    99+
    2024-04-02
  • 微信小程序中如何实现圆形进度条
    这篇文章主要为大家展示了“微信小程序中如何实现圆形进度条”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“微信小程序中如何实现圆形进度条”这篇文章吧。需求概要小程序...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作