进度条小程序

2023-09-20 16:16:01

0.前提知识

  1. 缓冲区:在C/C++语言中,会针对标准输出,给用户提供默认的缓冲区,并且根据一定的机制进行刷新(或者用户自己刷新,比如:在输出缓冲区中使用fflush(stdout)就可以直接刷新输出缓冲区)。值得注意的是,这个缓冲区是语言给出的,而不是系统给出的。

  2. 换行和回车:换行和回车是两回事,但是在C语言的换行符\n中,通常都会包含这两个概念(C语言的\n=换行+回车)a.换行,就是将光标挪至垂直位置的下一行b.回车,就是将光标挪至本行行首

1.简易实现进度条

另外,如果想要改成Windows下运行,那么只需要修改头文件#include <unistd.h>#include <windows.h>,将代码中的usleep()改为Sleep(),并且调整时间参数#define STIME 1000 * 1000#define STIME 100即可成功在windows环境运行下述代码。

    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #define SIZE 101
    #define MAX_RATE 100
    #define STYLE '#'
    #define STIME 1000 * 200//1000 * 1000 = 1秒
    const char* str = "\\|/—";
    void process();
    int main()
    {
        process();
        return 0;
    }
    void process()
    {
        int rate = 0;
        char bar[SIZE] = {0};
        int num = strlen(str);
        while(rate <= MAX_RATE)
        {
            printf("[%-100s][%d%%][%c]\r", bar, rate, str[rate % num]);
            fflush(stdout);
            usleep(STIME);//单位为毫秒
            bar[rate++] = STYLE;
        }
        printf("\n");
    }

注意:这个代码要注意shell的屏幕尺寸问题,尺寸不够可能显示乱码。

2.实际开发进度条

这个版本可以好好学,在过程实践中的确有所应用。

进度条通常要和某些任务关联的,比如:下载任务。

    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    #define SIZE 101
    #define MAX_RATE 100
    #define STYLE '#'
    #define STIME 1000 * 200//1000 * 1000 = 1秒
    const char* str = "-\\|/";
    typedef void (*callback_t)(int);
    void process_plus(int rate)//参数是传递了比例,根据比例来打一段进度条
    {
        static char bar[SIZE];
        int num = strlen(str);//旋转光标字符的长度
        static int i = 0;
        if (rate <= MAX_RATE && rate >= 0)
        {
            printf("[%-100s][%3d%%][%c]\r", bar, rate, str[i % num]);//这里换成i是为了让旋转光标能够运作,不受进度条控制,可以让用户职别这个进度条究竟是卡住了还是仍在加载
            fflush(stdout);
            bar[rate] = STYLE;
            i++;
        }
        if (rate == MAX_RATE)//主要是用在下一次别的程序调用这个函数的时候,避免进度条数组中还有#
        {
            memset(bar, '\0', sizeof(bar));
        }//这样程序可以适用与不同的任务
    }
    void download_1(callback_t cb)//第一个下载任务,正常调用
    {
        int rate = 0;
        while (rate <= 100)
        {
            (*cb)(rate++);//回调函数
            usleep(STIME);//单位为毫秒
        }
        printf("\n");
    }
    void download_2(callback_t cb)//第二个加载任务,模拟还在加载的情况,不是进度条程序卡住
    {
        int rate = 0;
        while (rate <= 100)
        {
            (*cb)(rate++);//回调函数
    
            if (rate == 50)
            {
                rate = 49;
            }
    
            usleep(STIME);//单位为毫秒
        }
        printf("\n");
    }
    int main()
    {
        download_1(process_plus);
        download_2(process_plus);
        return 0;
    }

在上述代码中,我们新增加了一些功能:

  1. 让进度条随着下载任务返回的行号来实时更新进度条

  2. 让旋转光标的选择和进度条的循环变量hile分离开来,使得旋转光标可以独自旋转,而不依赖于进度条。这样就避免了用户无法分辨进度条程序是卡住了,还是处于加载的状态

  3. 我们模拟了两个下载任务交给main()执行,并且内部发送信号rate给进度条,让用户查看两个下载任务的进度,并且第二个下载任务模拟了上面2.的情形

3.拓张功能进度条

我们可以给进度条增添颜色或者加粗、或者替换进度条的字符、亦或者直接使用颜色块来替换进度条字符等等,请发挥您的想象力。

4.补充Windows下的代码

虽然我在开头说明了如何修改成Windows下也可以运行的代码,但是我担心您对开头那段话有所误解,因此特意重新修改为在Windows下运行的代码。

    #include <stdio.h>
    #include <string.h>
    //#include <unistd.h>
    #include <windows.h>
    #define SIZE 101
    #define MAX_RATE 100
    #define STYLE '#'
    #define STIME 100//1000 * 1000 = 1秒
    const char* str = "-\\|/";
    typedef void (*callback_t)(int);
    void process_plus(int rate)//参数是传递了比例,根据比例来打一段进度条
    {
        static char bar[SIZE];
        int num = strlen(str);//旋转光标字符的长度
        static int i = 0;
        if (rate <= MAX_RATE && rate >= 0)
        {
            printf("[%-100s][%3d%%][%c]\r", bar, rate, str[i % num]);//这里换成i是为了让旋转光标能够运作,不受进度条控制,可以让用户职别这个进度条究竟是卡住了还是仍在加载
            fflush(stdout);
            bar[rate] = STYLE;
            i++;
        }
        if (rate == MAX_RATE)//主要是用在下一次别的程序调用这个函数的时候,避免进度条数组中还有#
        {
            memset(bar, '\0', sizeof(bar));
        }//这样程序可以适用与不同的任务
    }
    void download_1(callback_t cb)//第一个下载任务,正常调用
    {
        int rate = 0;
        while (rate <= 100)
        {
            (*cb)(rate++);//回调函数
            Sleep(STIME);//单位为毫秒
        }
        printf("\n");
    }
    void download_2(callback_t cb)//第二个加载任务,模拟还在加载的情况,不是进度条程序卡住
    {
        int rate = 0;
        while (rate <= 100)
        {
            (*cb)(rate++);//回调函数
            if (rate == 50)
            {
                rate = 49;
            }
    
            Sleep(STIME);//单位为毫秒
        }
        printf("\n");
    
    }
    int main()
    {
        download_1(process_plus);
        download_2(process_plus);
        return 0;
    }
更多推荐

Pytorch 深度学习实践 day01(背景)

准备线性代数,概率论与数理统计,Python理解随机变量和分布之间的关系人类智能和人工智能人类智能分为推理和预测推理:通过外界信息的输入,来进行的推测预测:例如,看到一个真实世界的实体,把它和抽象概念联系起来人工智能(机器学习):把以前我们用来做推理或预测的大脑,变成算法在机器学习和深度学习中,常用的是监督学习,即有标

【深度学习实验】线性模型(三):使用Pytorch实现简单线性模型:搭建、构造损失函数、计算损失值

目录一、实验介绍二、实验环境1.配置虚拟环境2.库版本介绍三、实验内容0.导入库1.定义线性模型linear_model2.定义损失函数loss_function3.定义数据4.调用模型5.完整代码一、实验介绍使用Pytorch实现线性模型搭建构造损失函数计算损失值二、实验环境本系列实验使用了PyTorch深度学习框架

针对敏感数据的安全转录服务

即便在新冠肺炎疫情期间,继续保持了最高级别的机密性新冠肺炎疫情带来的各种限制向所有服务提供商提出了挑战,促使提供商们想方设法采取更富想象力的新方法来满足客户的需求。澳鹏采用了一种由两种方案组成的工作机制,服务于客户机密材料的转录,既实现了高度的机密性,又保护了员工的安全。大多数转录服务提供商都会采用基本的安全措施,如员

前端深入理解JavaScript中的WeakMap和WeakSet

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录1.WeakMap和WeakSet概述1.1WeakMap1.2WeakSet2.WeakMap深入解析2.1WeakMap的创建和使用2.2WeakMap和内存管理2.3WeakMap和对象私有数据3.Wea

【Linux】Linux环境配置安装

目录一、双系统(特别不推荐)安装双系统的缺点:安装双系统优点(仅限老手):二、虚拟机+centos7镜像(较为推荐推荐)虚拟机的优点:虚拟机的缺点:​下载centos7的镜像文件下载Ubuntu镜像文件Ubuntu镜像文件下载地址三、云服务器Xshell云服务器共享Xshell删除用户四、powershell一、双系统

前端:运用HTML+CSS+JavaScript实现拼图游戏

前一段时间突然来了一个想法,就是运用前端知识实现一个拼图游戏,但是不知道具体怎样实现。今天,想到既然实现不了现实中我们看到的那种拼块,那么就用正方形来代替吧!效果如下:想到就是当小的图片块放到合适的位置上时,表示拼图完成。文章目录1.前端布局2.js脚本实现小图片块变换位置1.确定随机小图片块的选择2.打乱随机小图片块

阿里云无影云电脑介绍_云办公_使用_价格和优势说明

什么是阿里云无影云电脑?无影云电脑(原云桌面)是一种快速构建、高效管理桌面办公环境,无影云电脑可用于远程办公、多分支机构、安全OA、短期使用、专业制图等使用场景,阿里云百科分享无影云桌面的详细介绍、租用价格、云电脑的优势、使用场景、网络架构、无影云电脑与云服务器的区别以及关于无影云电脑的常见问题解答FAQ:目录阿里云无

以太网ARP测试实验

1.1ARP测试整体框架当上位机发送ARP请求时,FPGA返回ARP应答数据;当按下FPGA的触摸按键时,FPGA发送ARP请求,上位机返回ARP应答数据。PLL时钟对eth_rxc的输入时钟进行相位调整;GMIITORGMI模块负责将双沿(DDR)数据和单沿(SDR)数据之间的转换;ARP顶层模块实现了以太网ARP数

阿里云无影云电脑详细介绍_无影优势价格和使用

什么是阿里云无影云电脑?无影云电脑(原云桌面)是一种快速构建、高效管理桌面办公环境,无影云电脑可用于远程办公、多分支机构、安全OA、短期使用、专业制图等使用场景,阿里云百科分享无影云桌面的详细介绍、租用价格、云电脑的优势、使用场景、网络架构、无影云电脑与云服务器的区别以及关于无影云电脑的常见问题解答FAQ:目录阿里云无

Windows平台Qt6中UTF8与GBK文本编码互相转换、理解文本编码本质

快速答案UTF8转GBKQStringutf8_str="中UTF文";std::stringgbk_str(utf8_str.toLocal8Bit().data());GBK转UTF8std::stringgbk_str_given_by_somewhere="中GBK文";QStringutf8_str=QStr

GMAC & PHY介绍

1.1PHY接口发展(1)MII支持10M/100Mbps,一个接口由14根线组成,它的支持还是比较灵活的,但是有一个缺点是因为它一个端口用的信号线太多。参考芯片:DP83848、DM900A(该芯片内部集成了MAC和PHY接口)。DP83848芯片只支持10、100兆网络通信速度,采用4/5B编码。(2)RMII是简

热文推荐