返回顶部
首页 > 资讯 > 操作系统 >【Linux】在Linux上写一个进度条小程序
  • 381
分享到

【Linux】在Linux上写一个进度条小程序

linux运维服务器vim进度条 2023-08-19 09:08:07 381人浏览 泡泡鱼
摘要

👑作者主页:@安 度 因 🏠学习社区:StackFrame 📖专栏链接:Linux 文章目录 一、前言二、理解 '\r' 与 '\n'三、行缓冲1、提出问题2、认识行缓冲3、解

👑作者主页:@安 度 因
🏠学习社区:StackFrame
📖专栏链接:Linux

如果无聊的话,就来逛逛 我的博网 吧! 🌹

一、前言

在前三篇文章中,我们分别学习了 vim 、GCc 以及 make/makefile 。而在今天,我们将基于前三节课认识的基础上,并结合一些与回车换行、缓冲区有关的知识,在 linux 上写下一个简易的进度条小程序

成品展示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jK64mBQM-1673533983679)(https://anduin.oss-cn-nanjing.aliyuncs.com/%E8%BF%9B%E5%BA%A6%E6%9D%A17.gif)]

今天的内容比较轻松,只需要了解两个知识点,这个小程序就很容易写出来了,让我们开始今天的学习。

二、理解 ‘\r’ 与 ‘\n’

C 语言中有很多字符,而字符大体分为两类:可显字符、控制字符。

控制字符不可显示,例如 \r 和 \n 就是控制字符。

而在我们平时打字时,一行写满了需要换行,但是新起一行有很多种,例如:

image-20230112173730693

这样虽然新起一行了,但是不是我们想要的结果。

我们通常新起一行是在第二行的最左端,但是对于这个结果其实有两个操作:

  1. 跳转到第二行
  2. 回到第二行的最左端

有了这个基本概念,再来谈 \r 和 \n 的作用:

  • \r :回车 - 回到文本行的开头
  • \n:换行 - 新起一行

所以,其实我们 平时泛指的换行实际上是 回车 + 换行

且在语言范畴下,例如 C 语言,换行就可以达到 回车 + 换行 的效果。在平常,这一操作还是两个步骤。

三、行缓冲

行缓冲这个概念认识。

1、提出问题

首先先了解一下两个库函数:

  • sleep : Linux 下的休眠函数,单位是秒。头文件为 #include
  • fflush :刷新缓冲区

代码1:

#include int main(){    printf("hello xxx");    sleep(3);    return 0;}

现象:

在这里插入图片描述

分析:

光标停留在文本行的开头,但是字符串没有被打印。

反而像是 sleep 函数先起作用,然后 printf 函数再从光标处开始打印。

打印完之后,shell 提示符紧跟着字符串后显示。

代码2:

#include int main(){    printf("hello xxx\n");    sleep(3);    return 0;}

现象:

在这里插入图片描述

分析:

printf 打印的字符串先显示在终端上,光标位于字符串的下一行。

sleep 函数使程序休眠 3 秒后,shell 提示符从光标位置开始显示。

代码3:

#include int main(){    printf("hello xxx\r");    sleep(3);    return 0;}

现象:

在这里插入图片描述

分析:

printf 打印的字符串没有显示到终端,光标一直停留在该打印字符串的一行

sleep 函数休眠三秒后,shell 提示符直接打印在了屏幕上。

并没有看到字符串。

观察上面的现象,我们提出几个问题:

  1. 代码 1 好像是先执行了 sleep ,在执行 printf ,是这样吗?
  2. 代码 2 加上了 ‘\n’ ,字符串一开始就显示了,为什么?
  3. 代码 3 好像什么都没打印,这是为什么?

在解答这些问题之后,我们先了解一下行缓冲。

2、认识行缓冲

在内存中预留了一块空间,用来缓冲输入或输出的数据,这个保留的空间被称为缓冲区。

我们之前或多或少都听说过缓冲区。

在代码 1 中,由于程序是按照数据执行的,所以必定是先执行 printf 。

但是数据没有显示,所以这时候,数据就一定被保存在某个位置,保存的位置就是缓冲区。

而要让数据显示,是需要刷新缓冲区的。

行缓冲是缓冲区刷新策略的一种,在行缓冲模式下,当输入和输出中遇到 ‘\n’ 换行时,就会刷新缓冲区

有了这个概念,我们继续分析问题。

3、解答与拓展

解答

问题1:代码 1 好像是先执行了 sleep ,在执行 printf ,是这样吗?

当然不是。

由于程序是按照顺序执行的,所以必定是先执行完 printf 在执行 sleep 。

而数据没有被显示出来的原因是:数据保存在缓冲区中,但是没有主动刷新,当程序退出后,保存在缓冲区中的数据被自动刷新出来了。

所以才会造成这种现象。

问题2:代码 2 加上了 \n ,字符串一开始就显示了,为什么?

这里由于是直接往显示器上打印,所以采用的刷新方式为行缓冲。

所以执行碰到 ‘\n’ 时,就会把在缓冲区中的(换行符之前)的内容全部刷新出来。

所以这段代码一开始就会有数据显示,然后再 sleep 休眠。

问题3:代码 3 好像什么都没打印,这是为什么?

之前说过 \r 是换行,所以当 printf 遇到 \r 时,就把光标移到开头。

sleep 睡眠后,当程序退出,shell 打印提示符时,就覆盖了字符串。

拓展

数据真的是临时保留在缓冲区里的吗?光标如何理解?

我们用一段代码来理解这两个问题:

#include #include int main(){    printf("hello xxx\r");    fflush(stdout);    sleep(3);    return 0;}

现象:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GCFKMagU-1673533983682)(https://anduin.oss-cn-nanjing.aliyuncs.com/%E8%BF%9B%E5%BA%A6%E6%9D%A14.gif)]

观察现象,我们发现当我们使用 fflush 主动刷新缓冲区后,数据就显示在了屏幕上;且因为 ‘\r’ 的原因,光标指向字符串开头;当打印 shell 提示符时,就直接从光标位置开始覆盖。

所以对于这两个问题,我们已经得到了答案:

  1. 数据被临时保存在于缓冲区中,通过刷新就可以显示
  2. 数据是从光标位置开始打印的。

一句话理解光标:光标和显示器匹配,光标在哪里,显示器打印的时候就从哪里开始打印

4、倒计时

基于对上面的理解,我们先实现一个简单的倒计时。

倒计时就是在屏幕上不断显示数字,每次在同一位置显示,并将之前的数据覆盖。

既然是每次要从头开始覆盖,那么就可以用 ‘\r’ 来实现每次回到行首,并且可以通过相应的格式化控制显示多位打印。

但是 ‘\r’ 不会主动刷新,所以要用 fflush 函数主动刷新缓冲区。

在每次刷新之后,使用 sleep 函数,间隔一定的时间。

由此,我们可以很轻松写出代码,例如写一个从 10 开始的倒计时:

#include #include int main(){    int i = 10;    for (; i >= 0; i--) {        // 位宽控制,\r 回到开头        printf("%2d\r", i);        fflush(stdout); // 主动刷新        sleep(1); // 休眠    }    printf("\n"); // 换行,打印提示符    return 0;}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vNYKYWQJ-1673533983682)(https://anduin.oss-cn-nanjing.aliyuncs.com/%E8%BF%9B%E5%BA%A6%E6%9D%A15.gif)]

四、进度条

好了,接下来进入正题,我们开始写 进度条

进度条样式

  • 主体样式为两个中括号包裹,中间 => 推进的方式呈现,比如:[======>]
  • 主体右侧中括号位置保持不变,中间元素不断推进,比如:[=> ]
  • 显示当前加载进度,用 [num%] 显示,num 随着进度条的不断推进而变化
  • 显示加载样式,可以利用一个旋转的字符,例如 [\] 的样式,顺时针不断旋转

大约呈现状态为:[========>] [15%] [\]

采用多文件

文件存放在 proc 目录中

  • proc.h :函数声明
  • proc.c :进度条逻辑
  • main.c :函数调用

makefile 准备

由于采用多文件,所以依赖关系可以写成依赖文件列表的样式:

image-20230112212907590

分块逻辑

  1. 进度条主体

预留进度条大小为 100 个 = ,外加 1 个 > ,加上保存 '\0' 的位置,用数组存储为 102 个单位。

进度条是一行中的,所以需要用到 '\r' ,每次都需要使用 fllush 主动刷新缓冲区。

每次刷新出数据之后,将 = 填充到数组中,并且显示 > 。在最后一次显示时,控制 > 不要显示。

然后休眠一小会。由于休眠用 sleep 函数太慢。所以可以用 usleep 函数休眠,usleep 函数的参数单位是微秒。

根据这个写出代码:

image-20230112220450323

在这里插入图片描述

  1. 百分比显示

%% 显示为一个 % ,而 %d 为数字,这步很简单,只要在 printf 语句中加上内容:

printf("[%-100s][%d%%]\r", bar, i);
  1. 旋转光标

光标旋转方向为顺时针旋转,那么旋转时就可以用数组保存。

旋转每次显示内容分别为 | / - \\\ 代表一个 \ ,因为和 \ 结合的会被解析为转义字符,将其保存到字符串中。

而由于字符串一共就四个字符,所以输出的时候需要控制输出位置。

代码:

const char* str = "|/-\\"; // 字符串printf("[%-100s][%d%%][%c]\r", bar, i, str[i % 4]); // 输出语句

完整代码

proc.h

#pragma once #include extern void process();

proc.c

#include "proc.h"#include #include #define SIZE 102 // 数组大小#define STYLE '='#define FLAG '>'void process(){    const char* str = "|/-\\";    char bar[SIZE];    memset(bar, '\0', sizeof(bar));    int i = 0;    while (i <= 100) {      printf("[%-100s][%d%%][%c]\r", bar, i, str[i % 4]); // 格式控制      fflush(stdout); // 刷新      bar[i++] = STYLE; // 填充数据      if (i != 100) {          bar[i] = FLAG; // 如果不是最后一次则显示 >      }       usleep(100000); // 休眠    }    printf("\n");}

test.c

#include "proc.h"int main(){    process();    return 0;}

进度条展示

在这里插入图片描述

五、结语

到这里,本篇博客就到此结束了。

今天的内容相对来说还是很简单的,我们的今天核心就是了解 ‘\r’ 和 ‘\n’ 的区别,并认识了行缓冲。只要了这两块知识,写起进度条就很轻松了。

大家感兴趣也可以下去试一试。

如果觉得 a n d u i n anduin anduin 写的不错的话,可以 点赞 + 收藏 + 评论 支持一下哦!我们下期见~

来源地址:https://blog.csdn.net/m0_67867172/article/details/128667509

--结束END--

本文标题: 【Linux】在Linux上写一个进度条小程序

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

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

猜你喜欢
  • 【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 | 手把手教你写一个进度条小程序
    文章目录 一、前言二、理解 '\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 进度条
  • Linux新手小程序——进度条
    前言 目录 前言 需要先了解        1.\r和\n                           2.缓冲区 一.理解字符的含义:         学习c语言时,我们可以粗略把字符分为可显字符和控制字符.         ...
    99+
    2023-08-31
    linux c++ c语言 小程序
  • 【Linux旅行记】进度条小程序
    文章目录 一、预备知识1.1回车换行1.2缓冲区 二、倒计时三、进度条3.1普通版本源代码3.2高级版本源代码 🍀小结🍀 🎉博客主页:小智_x0___0x_ &#...
    99+
    2023-08-16
    linux 运维 小程序 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从练气到飞升》No.07 Linux第一个小程序-进度条的实现
    🕺作者: 主页 我的专栏C语言从0到1探秘C++数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的...
    99+
    2023-08-16
    linux 小程序 运维 服务器 开发语言
  • 【闪击Linux系列P7】进度条小程序の深度解剖
    ​​​​​ ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读: YY的《...
    99+
    2023-08-16
    linux vim 运维
  • 怎么在 linux命令行中输出一个进度条
    怎么在 linux命令行中输出一个进度条?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。代码如下:<php for ($i = ...
    99+
    2023-06-13
  • 怎么在linux 命令行中输出一个进度条
    本篇文章给大家分享的是有关怎么在linux 命令行中输出一个进度条,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。什么是Linux系统Linux是一种免费使用和自由传播的类UNI...
    99+
    2023-06-07
  • 怎么给程序加上进度条
    这篇文章主要介绍“怎么给程序加上进度条”,在日常操作中,相信很多人在怎么给程序加上进度条问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么给程序加上进度条”的疑惑有所帮助!接...
    99+
    2024-04-02
  • 怎么在Ubuntu/Debian Linux上编写、编译和运行一个C程序
    这篇文章给大家分享的是有关怎么在Ubuntu/Debian Linux上编写、编译和运行一个C程序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。步骤 1: 编写你的 C 程序,并使用一个 .c ...
    99+
    2023-06-15
  • C语言实现windows,linux双版本下的进度条小程序,快来试一试吧
    文章目录 C语言缓冲区🚀1.输入缓冲区🍇模拟登录密码场景🍇从键盘将内容输入到内存的真正过程🍇解决方法:清空输入缓冲区dz...
    99+
    2023-09-01
    c语言 linux 开发语言
  • 微信小程序进度条怎么实现
    这篇文章主要介绍“微信小程序进度条怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“微信小程序进度条怎么实现”文章能帮助大家解决问题。progress进度条。属性名类型默认值说明percentF...
    99+
    2023-06-26
  • 微信小程序实现环形进度条
    本文实例为大家分享了微信小程序实现环形进度条的具体代码,供大家参考,具体内容如下 index.wxss .circle {   position: absolute;   left:...
    99+
    2024-04-02
  • 微信小程序实现圆心进度条
    本文实例为大家分享了微信小程序实现圆心进度条的具体代码,供大家参考,具体内容如下 一、创建项目结构 打开微信开发者工具创建一个项目, 新建 与 pages 同级目录 componen...
    99+
    2024-04-02
  • 使用原生JavaScript编写一个进度条功能
    这期内容当中小编将会给大家带来有关使用原生JavaScript编写一个进度条功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。进度条实现介绍使用JavaScript实现进度条功能。原理:通过鼠标移动事件,...
    99+
    2023-06-06
  • 小程序怎么实现流程进度条功能
    今天小编给大家分享一下小程序怎么实现流程进度条功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实现小程序流程进度条需求:没...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作