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

🔥 个人主页:大耳朵土土垚
🔥 所属专栏:Linux系统编程

这里将会不定期更新有关Linux的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉

文章目录

  • 前言
  • 1. 回车概念
  • 2. 行缓冲区
  • 3. 进度条代码
    • ✨彩色进度条
    • ✨模拟真实下载速度的进度条

前言

  我们之前学习过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];//最后存放/0memset(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源文件:

运行结果如下:


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

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

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


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


进度条打印效果如下:


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/437260.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker仓库搭建

目录 一、Docker Hub 二、私有Registry仓库搭建 1、下载并开启仓库镜像registry 2、Registry加密传输 3、建立一个registry仓库 4、为客户端建立证书 5、测试 6、为仓库建立登录认证 三、Harbor仓库搭建 Docker 仓库&#xff08;Docker Registry&#xff09; 是用于存…

PHP程序如何实现限制一台电脑登录?

PHP程序如何实现限制一台电脑登录&#xff1f; 可以使用以下几种方法&#xff1a; 1. IP地址限制&#xff1a;在PHP中&#xff0c;可以通过获取客户端的IP地址&#xff0c;然后与允许登录的IP地址列表进行比对。如果客户端的IP地址不在列表中&#xff0c;就禁止登录。 “php $…

快速创建第一个Spring Boot 项目

一、介绍 Spring Boot 是一个开源的 Java 基础框架&#xff0c;它基于 Spring 框架&#xff0c;用于创建独立、生产级别的基于 Spring 的应用程序&#xff0c;你可以“跑起来”&#xff08;run&#xff09;你的 Spring 应用程序。Spring Boot 让基于 Spring 的应用开发变得更容…

基于单片机的两轮直立平衡车的设计

本设计基于单片机设计的两轮自平衡小车&#xff0c;其中机械部分包括车体、车轮、直流电机、锂电池等部件。控制电路板采用STC12C5A60S2作为主控制器&#xff0c;采用6轴姿态传感器MPU6050测量小车倾角&#xff0c;采用TB6612FNG芯片驱动电机。通过模块化编程完成了平衡车系统软…

leetcode:380. O(1) 时间插入、删除和获取随机元素

实现RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否则&#xff0c;返回 false 。bool remove(int val) 当元素 val 存在时&#xff0…

前端框架对比和选择指南

前端框架对比和选择指南 随着 Web 开发技术的快速发展&#xff0c;前端框架已经成为了现代 Web 开发的核心工具之一。它们为开发人员提供了快速构建高效、交互性强的应用的基础。当前流行的前端框架主要包括 React.js、Vue.js 和 Angular.js。在这篇技术博客中&#xff0c;我们…

如何创建一个docker,给它命名,且下次重新打开它

1.创建一个新的docker并同时命名 docker run -it --name one ubuntu:18.04 /bin/bash 这时候我们已经创建了一个docker,并且命名为"one" 2.关闭当前docker exit 3.这时docker已经终止了&#xff0c;我们需要使用它要重新启动 docker start one 4.现在可以重新打…

react crash course 2024(7) react router dom

安装 npm i react-router-dom 引入 import {Route,createBrowserRouter,createRoutesFromElements,RouterProvider} from react-router-dom 在app.jsx const router createBrowserRouter(createRoutesFromElements(<Route index element {<h1>My App</h1>…

基于51单片机的3路电压测量-proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1PG2vzudc1QKHGSBfjPF0eQ 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

金智维KRPA之Excel自动化

Excel自动化操作概述 Excel自动化主要用于帮助各种类型的企业用户实现Excel数据处理自动化&#xff0c;Excel自动化是可以从单元格、列、行或范围中读取数据&#xff0c;向其他电子表格或工作簿写入数据等活动。 通过相关命令&#xff0c;还可以对数据进行排序、进行格式…

QT 界面编程中使用协程

QT 界面编程中使用协程 一、概述二、集成2.1、编译 Acl2.2、将 Acl 库集成到 QT 项目中2.3、开始编写代码2.3.1、QT 程序初始化时初始化 Acl 协程2.3.2、在界面中创建协程2.3.3、界面程序退出前需要停止协程调度2.3.4、在界面线程中下载数据2.3.5、在协程中延迟创建窗口 2.4、效…

[sql-04] 连续出现至少三次的数字

数据准备 CREATE TABLE leecode_01 (id bigint not null AUTO_INCREMENT,num int DEFAULT NULL COMMENT 用户名,primary key(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT leecode(连续出现3次的数字)insert into leecode_01(num) values(12); insert into leecode_01…

C++入门基础 (超详解)

文章目录 前言1. C关键字2. C的第一个程序3. 命名空间3.1 namespace的定义3.2 命名空间的嵌套3.3 命名空间使用3.4 查找优先级总结 4. C输入和输出4.1 标准输入输出 (iostream库)4.2 文件输入输出 (fstream库)4.3 字符串流 (sstream库)4.4 C格式化输出4.5 std::endl和\n的区别 …

废物利用,三百块电脑如何升级并安装双系统便携使用

文章目录 引言最初的配置开始改装更换内存升级硬盘2.5 英寸 sata 固态msata 加装 升级电池其他的升级娱乐大师跑分 双系统安装前提条件设置 Bios安装 win 10安装 Manjaro时间同步问题 屏幕问题黑屏难开 引言 最近浏览 b 站的二手笔记本信息&#xff0c;想要整个二手笔记本玩玩…

imagickd写shell的技术学习

前言 没想到吧哥们&#xff0c;imagickd也能写shell&#xff0c;真是学到了不少&#xff0c;下面会具体分析是如何写shell的 基础知识 Imagick类 参考官方手册https://www.php.net/manual/zh/class.imagick.php 重点关注他的构造方法 (PECL imagick 2, PECL imagick 3) …

c++primer第十三章 类继承

本章内容&#xff1a;单个类就可以提供用于管理对话框的全部资源。通常&#xff0c;类库是以源代码的方式提供的&#xff0c;这意味着可以对其进行修改&#xff0c;以满足需求。但是&#xff0c;C-提供了比修改代码更好的方法来扩展和修改类。这种方法叫作类继承(class inheria…

手机/平板端 Wallpaper 动态壁纸文件获取及白嫖使用指南

Wallpaper 动态壁纸文件获取及使用指南 目录 壁纸文件获取手机 / 平板使用手机 / 平板效果预览注意事项PC/Mac 使用 1. 壁纸文件获取链接 链接&#xff1a;夸克网盘分享 复制链接到浏览器打开并转存下载即可。 &#xff08;主页往期视频的 4K 原图和 mpkg 动态壁纸文件&#xf…

Redis接口访问优化

说明&#xff1a;之前写过一篇使用Redis接口访问的博客&#xff0c;如下。最近有相关需求&#xff0c;把代码拿出来后&#xff0c;做了一些优化&#xff0c;挺有意思的&#xff0c;本文介绍在原基础上 使用Redis实现接口防抖 优化 总的来说&#xff0c;这次使用Redis实现接口…

IDEA 系列产品 下载

准备工作 下载 下载链接&#xff1a;https://www.123865.com/ps/EF7OTd-yVHnH 仅供参考 环境 演示环境&#xff1a; 操作系统&#xff1a;windows10 产品&#xff1a;IntelliJ IDEA 版本&#xff1a;2024.1.2 注意&#xff1a;如果需要其他产品或者版本可以自行下载&#xff0…

ESP32微信小程序SmartConfig配网

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 ESP32&微信小程序SmartConfig配网 前言一、SmartConfig是什么&#xff1f;二、使用乐鑫官方的smart_config例子1.运行照片 三、微信小程序总结 前言 本人是酷爱ESP32S3这…