【Linux篇】Linux下的第一个小程序--进度条 蹦迪炫彩进图条

news2024/11/27 2:21:57

💛不要有太大压力🧡
💛生活不是选择而是热爱🧡

在这里插入图片描述

文章目录

  • Linux下第一个小程序:进度条
    • 两个背景知识
      • 缓冲区
      • 回车和换行是一个概念?
    • 进图条原理
    • 进度条代码
    • 效果
    • 其他玩法:蹦迪版进度条

Linux下第一个小程序:进度条

两个背景知识

缓冲区

举一个例子

我们用<unistd.h>中的sleep()函数来休眠,单位(秒)

image-20220728221113160

以上程序:先输出hello,world!然后等待三秒程序结束

但是如果去掉换行符,如下:

image-20220728221133937

程序的运行结果:先等待三秒,然后输出hello,world!

这是为什么呢?

只有一种可能:printf早就执行完了, 只是内容没有输出到显示器

C语言给我们提供了输出缓冲区,输出的内容先流入缓冲区中,而缓冲区按照一定的刷新策略来刷新,刷新后才会显示到 屏幕

所谓的输出缓冲区,其实就是C语言提供的一段内存空间

其实,printf是输出到stdout(标准输出流)的,对应的就是显示器。

对于显示器设备,一般的刷新策略是:碰到’\n’就把’\n’之前的所有字符显示出来(包括’\n’)

如果想立即刷新:fflush(FILE* steam)函数,参数是文件流

C语言有三个标准流:stdin``stdout``stderr

如图:在stdio.h中声明

image-20220728222303483

所以,当代码改成这样的时候就可以先打印出内容然后再执行sleep函数了

回车和换行是一个概念?

no!

回车:回到当前行的最开始

换行:光标垂直向下移动一行

image-20220729071849767

所以,当前行输入之后,来到下一行的最开始其实是:回车+换行

但是其实键盘上的回车帮我们干了这两件事

分开来看,回车:\r

换行:\n

而其实在语言中的’\n’是被当作回车+换行的,所以在语言中有’\n’就自动来到下一行的最开始了

image-20220729073516509

看当前代码,输出结果是

当前的值是5
当前的值是4
当前的值是3
当前的值是2
当前的值是1

但是如果把’\n’换成’\r’,如下图

image-20220729073625398

结果是什么都不会输出

因为只有’\r’,没有’\n’,每一次数据输入到缓冲区之后没有被刷新('\n’刷新缓冲区)。程序运行结束缓冲区会自动刷新,此时缓冲区的内容是:当前的值是:5\r当前的值是:5\r当前的值是:4\r当前的值是:3\r当前的值是:2\r当前的值是:1\r,这些内容会一起刷新到显示器,由于光标马上回到最开头,所以什么都不会输出

那么如何强制刷新呢?

fflush:强制把缓冲区的内容刷新到缓冲区

image-20220729090219942

此时的输出结果就是

当前值是5  (清屏)
当前值是4  (清屏)
当前值是3  (清屏)
当前值是2  (清屏)
当前值是1  

也就有了倒计时的效果

为什么呢?

  1. 因为每次把当前的值是%d\r放入缓冲区,然后强制刷新缓冲区就把该内容打印到了屏幕,并且因为sleep,屏幕保持睡眠,不会马上把光标回到开头,sleep结束,光标回到开头,又从头打印下一次的值
  2. 因为每一次打印的字符串长度是一样的,每一次打印完光标回到当前行的最开始,然后强制刷新缓冲区到屏幕,下一次,相同的值进行覆盖就看不到变化,只有最后的数字不同,所以只有后面的值发生变化

注意:‘\n’和’\r’只有到了显示器才会有效果,在缓冲区只是个字符

进图条原理

image-20220729101338524

进度条代码

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

#define NUM 101
int main()
{
    char ch[NUM]={0};
    memset(ch,0,NUM);
    int cur=0;
    char* label="|/-\\";//四个状态不停旋转,表示正在加载
    while(cur<=100)
    {
        //%100s:打印的字符串始终占100个字符,符号是靠左(因为C语言默认是靠右占位)
        printf("[%-100s][%d%%](%c)\r",ch,cur,label[cur%4]);//模4是为了不超过数组索引(循环四个字符)
        ch[cur++]='=';//每一次多一个#                                                                                             
         fflush(stdout);//每一次进行刷新
         usleep(50000);// 单位是微秒(1s=10^6us)
     }
     printf("\n");
     return 0;
}

效果

C语言进度条

其他玩法:蹦迪版进度条

这里需要用到Linux系统终端的文字颜色,是文本模式下的系统显示功能,与具体语言无关

转义序列以控制字符’ESC’开头。该字符的ASCII码十进制表示为27,十六进制表示为0x1B,八进制表示为033。多数转义序列超过两个字符,故通常以’ESC’和左括号’['开头。该起始序列称为控制序列引导符(CSI,Control Sequence Intro),通常由\033[\e[代替

不同颜色由\033[xm中的数字x决定 (固定格式末尾有个m)

常见的文字颜色:

30:黑

31:红

32:绿

33:黄

34:蓝色

35:紫色

36:深绿

37:白色

举个例子

如果想让输出helloworld为红色

printf("\033[31m"):如果不把文字设置为原来的终端颜色,之后就不会变了

而颜色的参数(30)所以我们可以利用一个变量来动态改变

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

#define NUM 101
int main()
{
    char ch[NUM]={0};
    memset(ch,0,NUM);
    int cur=0;
    int x = 1;
    char* label="|/-\\";//四个状态不停旋转,表示正在加载
    while(cur<=100)
    {
        x=x%7+1;//红到白色7中颜色
        if(cur==100)
        {
            x=7;//最后一次恢复白色
        }
        printf("\033[3%dm[%-100s][%d%%](%c)\r",x,ch,cur,label[cur%4]);//模4是为了不超过数组索引(循环四个字符)
        ch[cur++]='=';//每一次多一个#
        x++;
        fflush(stdout);//每一次进行刷新
        usleep(50000);                                                                                                            
    }
    printf("\n");
    return 0;
}

效果

蹦迪版进度条

✨感谢阅读~ ✨
❤️码字不易,给个赞吧~❤️

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot集成flink

Flink是一个批处理和流处理结合的统一计算框架&#xff0c;其核心是一个提供了数据分发以及并行化计算的流数据处理引擎。 最大亮点是流处理&#xff0c;最适合的应用场景是低时延的数据处理。 场景&#xff1a;高并发pipeline处理数据&#xff0c;时延毫秒级&#xff0c;且兼具…

永别了,垃圾病毒山寨软件!

在下载软件这一块&#xff0c;电脑与手机最大的不同就是手机有专门的应用商店&#xff0c;而电脑我们却只能使用搜索引擎找寻软件官网下载&#xff0c;这对于大多数对电脑不熟悉的人来说&#xff0c;很可能会下载到恶意病毒软件。 尽管从Win10开始&#xff0c;微软已经在系统中…

【kubernetes】关于k8s集群的存储卷

目录 一、存储卷的分类 二、empty存储卷以及特点 三、hostpath存储卷以及特点 四、nfs存储卷以及特点 五、pvc存储卷 查看pv的定义 查看pvc的定义 实操&#xff1a;静态创建pv的方式 实现pvc存储卷 步骤一&#xff1a;先完成nfs的目录共享&#xff0c;需要准备不同的目…

原油数据处理:1.聚类、盐含量测定与近红外光谱快速评估

一、原油种类的聚类分析 在塔里木盆地塔河油田的原油处理过程中&#xff0c;需要对原油进行地球化学特征研究&#xff0c;以了解其成因和特征。根据地球化学手段的综合研究结果&#xff0c;塔河油田奥陶系原油属于海相沉积环境&#xff0c;成熟度较高&#xff0c;正构烷烃分布…

Python爬虫实战第三例【三】【上】

零.实现目标 爬取视频网站视频 视频网站你们随意&#xff0c;在这里我选择飞某速&#xff08;狗头保命&#xff09;。 例如&#xff0c;作者上半年看过的“铃芽之旅”&#xff0c;突然想看了&#xff0c;但是在正版网站看要VIP&#xff0c;在盗版网站看又太卡了&#xff0c;…

爬虫实战——scrapy框架爬取多张图片

scrapy框架的基本使用&#xff0c;请参考我的另一篇文章&#xff1a;scrapy框架的基本使用 起始爬取的网页如下&#xff1a; 点击每张图片&#xff0c;可以进入图片的详情页&#xff0c;如下&#xff1a; 代码实现&#xff1a; 项目文件结构如下 img_download.py文件代码 im…

探究java反射取值与方法取值性能对比

探究java反射取值与方法取值性能对比 由于我开发框架时&#xff0c;经常需要对象取值。常用的取值方式有&#xff1a; 反射取值方法调用取值 环境 同一台电脑&#xff1a; jdk 21.0.2 idea 2023.3.3 1. 测试代码&#xff08;常用&#xff09; 1.1 反射取值 public stat…

IO流操作大集合

1、分类 File只能对文件进行处理&#xff0c;如果想要处理文件里的内容&#xff0c;则要使用文件流。 文件流可分为字符和字节流&#xff1a; 字节流&#xff08;可读写任何格式的文件&#xff09; inputStream&#xff08;抽象父类&#xff09; FileInputStream outputStre…

STM32CubeIDE基础学习-基础外设初始化配置

STM32CubeIDE基础学习-基础外设初始化配置步骤 前言 前面的文章介绍了基础工程的创建步骤&#xff0c;这篇文章就接着在基础工程的基础上来配置相关外设了&#xff0c;下面以STM32F103C8T6的主芯片为例进行简单配置。 基础工程创建步骤回顾 具体的配置步骤流程如下&#xff1…

[两个栈实现队列]

[两个栈实现队列] 一、题目二、思路三、代码 一、题目 二、思路 //思路:两个栈实现队列&#xff0c;栈是先入后出&#xff0c;队列是队尾入&#xff0c;对头出&#xff0c;&#xff08;先入先出&#xff09;&#xff0c;那么可以这样干&#xff0c;假设一个栈Pushst&#xff0c…

Java基础 - 8 - 算法、正则表达式

一. 算法 什么是算法&#xff1f; 解决某个实际问题的过程和方法 学习算法的技巧&#xff1f; 先搞清楚算法的流程&#xff0c;再直接去推敲如何写算法 1.1 排序算法 1.1.1 冒泡排序 每次从数组中找出最大值放在数组的后面去 public class demo {public static void main(S…

如何使用 ArcGIS Pro 统计四川省各市道路长度

在某些时候&#xff0c;我们需要进行分区统计&#xff0c;如果挨个裁剪数据再统计&#xff0c;不仅步骤繁琐、耗时&#xff0c;还会产生一些多余的数据&#xff0c;这里教大家如何在不裁剪数据的情况下统计四川各市的道路长度&#xff0c;希望能对你有所帮助。 数据来源 教程…

web前端之uniApp实现选择时间功能

MENU 1、孙子组件1.1、html部分1.2、JavaScript部分1.3、css部分 2、子组件2.1、html部分2.2、JavaScript部分2.3、css部分 3、父组件3.1、html部分3.2、JavaScript部分 4、效果图 1、孙子组件 1.1、html部分 <template><view><checkbox-group change"ch…

HashSet在添加元素时,是如何判断元素重复的? (原理详解 | 易错案例)

前言&#xff1a;我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c;注意&#xff0c;Obje…

分享一个完全免费的GPT4站点,gpts也可以用

给大家分享一个完全免费的GPT4站点&#xff0c;gpts也可以用点击链接可用

板级PDN(电源分配网络)设计要点综述

目录 目标阻抗去耦方法 确定目标阻抗 确定目标频点 VRM 去耦电容 安装电感 平面电容 总结 去耦电容 PCB叠层设计 扩展阅读 目标阻抗去耦方法 确定PCB去耦方案的策略是使用频域目标阻抗法&#xff0c;通过层间电容和分立电容器组合的使用&#xff0c;保证电源轨阻抗在…

【MySQL】视图 -- 详解

视图 是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 一、基本使用 1、创建视图 create view 视图名 as select 语句; 好处&#xff1a;…

基于springboot+vue实现电子商务平台管理系统项目【项目源码+论文说明】

基于springboot实现电子商务平台管理系统演示 研究的目的和意义 据我国IT行业发布的报告表明&#xff0c;近年来&#xff0c;我国互联网发展呈快速增长趋势&#xff0c;网民的数量已达8700万&#xff0c;逼近世界第一&#xff0c;并且随着宽带的实施及降价&#xff0c;每天约有…

Node.js最准确历史版本下载(以下载Node.js16.17.1版本为例)

先进入官网:Node.js https://nodejs.org/en 括号中LTS代表稳定版本. 嫌其他冗余博客帖子多&#xff0c;找起来费眼睛,可以到/release下载:Node.js,在blog后面加/release https://nodejs.org/en/blog/release/ 点击next翻页,跟上面同样的步骤

吴恩达深度学习笔记:深度学习引言1.1-1.6

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第一周&#xff1a;深度学习引言(Introduction to Deep Learning)1.1 欢迎(Welcome)1.2 什么是神经网络&#xff1f;(What is a Neural Network) 第一门课&#xff1a;神经网络和深度学习 (Ne…