Linux第一个小程序——进度条实现

云掣YunChe7个月前行业资讯291

前言

我们之前学习过vim编辑器、gcc/g++的使用和make/makefile工具,所以今天我们就可以使用它们创建Linux上第一个小程序——进度条。在实现进度条之前我们首先需要补充两个小知识。


1. 回车概念

  在Linux系统中,\n和\r是两个重要的转义字符,它们分别代表着换行符和回车符,各自具有不同的功能和应用场景。


\n(换行符):

【定义】:\n表示换行符,其英文全称是newline,控制字符可以写成LF(Line Feed)。它将光标移动到下一行的开头位置,常用于分隔文本的不同行。

【功能】:在Linux系统中,\n通常用于表示文本的换行。当新的字符输入时,它们会在新的行上输出。这使得文本内容更加清晰、易读。


\r(回车符):

【定义】:\r表示回车符,其英文全称是return,控制字符可以写成CR(Carriage Return)。它将光标移动到当前行的开头位置,但不移动到下一行。

【功能】:在Linux系统中,\r通常用于在同一行上连续输出不同的内容。如果有新的字符输入,它们将覆盖已存在的字符。这使得在同一行内更新文本内容成为可能。


在制作进度条等动态文本输出时,\r非常有用。通过不断更新同一行的内容,可以创建出动态的视觉效果。


✨\n的主要功能是换行,将光标移动到下一行的开头;而\r的主要功能是回车,将光标移动到当前行的开头。


2. 行缓冲区

  在Linux中,行缓冲区是一种缓冲机制,用于存储输出数据,直到满足某个条件后才将数据发送出去。行缓冲区是按行存储数据的,即只有当输出的数据中包含换行符时,才会发送数据。


  这种缓冲机制对于一些需要批量输出的场景非常有用,可以提高效率。同时,也可以使用特定的函数来刷新缓冲区,强制将缓冲区中的数据发送出去。


需要注意的是,行缓冲区只是一种缓冲机制,默认情况下并不是所有的输出都是行缓冲的,可以通过配置文件或者代码中的特定函数来改变缓冲方式。


  所以我们在动态显示文本进度条时借助的是\r回滚而非换行,无法满足输出数据的条件,这时我们就需要借助fflush(stdout);函数。


fflush(stdout)是用来刷新标准输出流(stdout)的函数。标准输出流是一个缓冲流,当数据写入到标准输出流时,并不会立即显示出来,而是先存储在缓冲区中,当缓冲区被填满或者手动调用fflush函数时,才会将缓冲区的内容刷新到显示器上。



3. 进度条代码

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

int main()
{
    //进度条代码

    //1.数组存放字符
    char bar[101];//最后存放/0
    memset(bar, '#', 100);

    //旋转字符数组
    char label[4] = "-\\|/";//反斜杠要两个进行转义
    //2.循环打印
    int i = 0;
    while (i < 100)
    {
        bar[i + 1] = '\0';
        printf("[%-100s][%d%%][%c]\r", bar, i + 1, label[i % 4]); //加上旋转标识
        fflush(stdout);//刷新缓冲区
        usleep(10000);
        bar[++i] = '#';
    }

    //3.最后换行
    printf("\n");
    return 0;
}


我们可以在Linux上打开vim编辑器创建progress.c代码,将上述进度条代码写上去,然后使用make/makefile工具搭配gcc的使用,将progress.c编译成可执行文件progress,然后在命来行输入./progress运行该程序,结果如下:



这样我们就可以模拟实现Linux上第一个小程序——文本进度条啦🥳🥳


清理文件时我们就可以使用make clean删除文件:



如果需要重新编译progress.c文件我们也可以使用make命令来实现:



Makefile文件内容如下:



✨彩色进度条

  在C语言中,直接进行彩色输出并不是标准的一部分,因为C语言本身并不支持这种特性。然而,如果你在控制台环境下编写程序,并且目标环境如Linux或某些支持ANSI转义码的系统,你可以利用ANSI escape codes(ANSI转义序列)来模拟颜色输出。


比如我们想在控制台上打印一段带颜色的文字。假设你想打印一条红色的消息"Hello, World!",你可以这样写:

#include <stdio.h>

int main() {
    if (isatty(fileno(stdout))) { // 检查是否是终端
        printf("\033[31m"); // 设置红色字体
        printf("Hello, World!\033[0m"); // 打印消息并恢复默认颜色
    } else {
        printf("Hello, World!"); // 对于非终端设备,如文件,直接打印纯文本
    }
    return 0;
}


在这个例子中,如果运行程序的是一个终端,它会显示红色的"Hello, World!";如果不是终端(如通过重定向输出到文件),则只显示普通的白色文字。


对于颜色,通常会用到以下几种代码:


前景色:


黑色: \033[30m

红色: \033[31m

绿色: \033[32m

黄色: \033[33m

蓝色: \033[34m

青色: \033[36m

紫色: \033[35m

白色: \033[37m

背景色:


黑色: \033[40m

红色: \033[41m

绿色: \033[42m

黄色: \033[43m

蓝色: \033[44m

青色: \033[46m

紫色: \033[45m

白色: \033[47m

结束颜色设置: \033[0m 或 \x1b[0m (等效)


当你想要结束颜色输出时,可以使用\033[0m来清除所有设置。但是请注意,这取决于终端是否支持这些转义码,以及用户终端配置。在Windows控制台上,由于其默认不支持ANSI转义码,上述方法可能无法生效。


所以对于进度条代码,我们可以将其设置我们喜欢的颜色,只需要在循环打印前后设置和取消字体颜色,代码如下:


然后我们使用make命令重新编译progress.c源文件:


运行结果如下:



✨模拟真实下载速度的进度条

  我们需要使用随机数来模拟一次下载的进度,然后累加到进度条中而不是一直维持一个速度下载,代码如下:


然后我们就可以使用随机数模拟下载了,结果如下:



然后就可以利用每次的下载量比例更新进度条,代码如下:



进度条打印效果如下:



本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!  

云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:

《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq

想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ

相关文章

MySQL运维之分库分表与读写分离

MySQL运维之分库分表与读写分离

分库分表1.介绍问题分析随着互联网以及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈:IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较...

RabbitMQ 进阶2(消费者可靠性+延迟消息)

RabbitMQ 进阶2(消费者可靠性+延迟消息)

三、消费者可靠性当RabbitMQ向消费者投递消息以后,需要知道消费者的处理状态如何。因为消息投递给消费者并不代表就一定被正确消费了,可能出现的故障有很多,比如:消息投递的过程中出现了网络故障消费者接...

【Docker】深入了解 Docker:终极命令指南(上)

【Docker】深入了解 Docker:终极命令指南(上)

Docker 是现代开发中不可或缺的工具,能够简化应用程序的部署和管理。在本文中,我们将深入探讨 Docker 的核心命令,帮助您在日常工作中高效使用这一强大平台。1. 系统信息命令了解 D...

Linux 安装Docker完整教程(六)

Linux 安装Docker完整教程(六)

背景近些年随着云原生的发展,Docker在云原生中的作用使得它也蓬勃发展起来。今天这篇文章就带大家一起实现一下在Linux操作系统下Docker的部署过程,收藏起来,以备不时之需。当然,如果对Dock...

解决虚拟机卡死且无法强制结束进程的问题

解决虚拟机卡死且无法强制结束进程的问题

【Linux虚拟机死机】有很多种情况,最常见的是系统负载过高导致的。可以是运行内存耗用极大的程序,也会迅速提升系统负载。由于系统负载过高导致的卡死,一定是解决的越快越好!不能再试图依赖任何图形界面的东...

微服务保护和分布式事务(1)

微服务保护和分布式事务(1)

一、微服务保护保证服务运行的健壮性,避免级联失败导致的雪崩问题,就属于微服务保护。为了方便讲解,下面的商品服务是故障方,购物车服务是故障调用方。1.1 微服务保护方案:微服务保护的方案有很多,比如:请...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。