[Linux]手把手教你制作进度条小程序

news2024/11/18 11:18:18

[Linux]制作进度条小程序

文章目录

  • [Linux]制作进度条小程序
    • C语言中的\n和\r字符
    • 缓冲区的刷新策略
    • 进行进度条代码编写

C语言中的\n和\r字符

C语言中字符分为两种:

  • 可显字符
  • 控制字符

其中可显字符就是字符a这类的字符,控制字符就是\n这种控制字符。

对于我们制作进度条,我们只需要关注两个控制字符:

  • \r – 进行回车操作
  • \n – 进行换行加回车操作

说明: \n本身是换行字符,但是C语言本身将其解析成了换行加回车。

为了更好地体会字符\r和\n的作用,我们需要做一些测试,为了方便进行编译,创建makefile文件,文件内容如下:

mytest:test.c
	gcc -o mytest test.c
.PHONY:clean
clean:
	rm -f mytest

首先执行如下代码:

#include <stdio.h>
#include <unistd.h>
int main()
{
	printf("hello world");
    sleep(3);
    fflush(stdout);
	return 0;
}

说明:

  • fflush(stdout)是将标准输出缓冲区刷新,便于观察现象。
  • sleep为Linux系统的休眠函数。

执行结果如下:

image-20230730125207629

在打印完hello world后,程序休眠,"光标"在同一行的下一个位置

image-20230730125310098

休眠结束后,将会接着从光标位置开始打印,因此打印的[qxm@aliyun-centos review]$命令行提示符,紧跟在hello world其后。

再执行如下代码:

#include <stdio.h>
#include <unistd.h>
int main()
{
    printf("hello world\n"); 
    sleep(3);
    return 0;
}

执行结果如下:

image-20230730125541374

由于\n被C语言解析成换行加回车,在打印完hello world后程序休眠,"光标"会到下一行的开始的位置。

image-20230730123307921

休眠结束后,将会接着从光标位置开始打印,因此[qxm@aliyun-centos review]$命令行提示符是在下一行的行首打印。

最后执行如下代码:

#include <stdio.h>
#include <unistd.h>
int main()
{
    printf("hello world\n"); 
    sleep(3);
    return 0;
}

说明:

  • fflush(stdout)是将标准输出缓冲区刷新,便于观察现象。
  • sleep为Linux系统的休眠函数。

执行结果如下:

image-20230730130940986

由于\r为回车,在打印完hello world后程序休眠,"光标"会回到行首。

image-20230730123307921

休眠结束后,将会接着从光标位置开始打印,因此[qxm@aliyun-centos review]$命令行提示符将原有的hello world覆盖了。

image-20230730131108150

缓冲区的刷新策略

Linux系统下,C语言会将要打印的字符先存放在缓冲区中,只有将缓冲区内的字符刷新到屏幕上,才能在屏幕上看到,缓冲区刷新的情况如下:

  • 遇到\n会将\n前的所有字符刷新到屏幕上。
  • 程序结束时自动刷新缓冲区。

对于缓冲区测试,我们执行如下代码:

#include <stdio.h>
#include <unistd.h>
int main()
{
	printf("hello world\r");
  	sleep(3);
	return 0;
}

执行结果如下:

image-20230730132019107

因为缓冲区没有刷新,因此程序休眠时,没有任何打印。

image-20230730133131040

程序执行结束后,缓冲区被自动刷新,hello world被打印出来,但是由于\r回车将"光标"退回到行首,因此命令提示符的打印将前面的打印覆盖了。

再执行如下代码:

#include <stdio.h>
#include <unistd.h>
int main()
{
	printf("hello world\n");
  	sleep(3);
	return 0;
}

执行结果如下:

image-20230730132354920

由于遇到了\n缓冲区内的数据在休眠前刷新了。

image-20230730132526954

程序休眠结束后,命令行提示符从光标所在位置开始打印。

进行进度条代码编写

创建以下文件构成代码结构:

  • myproc.h – 保存进度条代码的声明
  • myproc.c – 保存进度条代码的实现
  • main.c – 调用进度条代码

myproc.h文件中的核心结构如下:

#pragma once 
#include <stdio.h>
extern void process();

myproc.c文件中的核心结构如下:

#include "myproc.h"
void process()
{
  //...
}

main.c文件中的核心结构如下:

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

同时创建makefile文件,makefile文件内部写入如下内容:

myproc:myproc.c main.c
	gcc -o myproc myproc.c main.c
.PHONY:clean
clean:
	rm -f myproc

建立好代码结构后,编写如下代码充当图形化进度条:

#include "myproc.h"
#include <string.h>
#include <unistd.h>

#define STYLE '='
#define ARROW '>'
#define SIZE 101

void process()
{
  char buf[SIZE];
  memset(buf, 0 , SIZE);
  int i = 0;
  while(i <= 100)
  {
    printf("[%-100s]\r", buf);
    fflush(stdout);
    buf[i++] = STYLE;
    if(i != 100 )buf[i] = ARROW;
    usleep(100000);
  }
  printf("\n");
}

首先创建一个字符串用于保存要打印的图形化进度条buf,对其进行初始化,然后在打印时进行左对齐打印buf并且按100个字符长度打印,

每次打印完回车覆盖上一次从打印,并且刷新缓冲区使得打印显示到屏幕上,使用休眠函数来充当进度的加载。

打印的效果如下:

111

除了图形化进度条还要设置数字化进度显示,因此需要对打印进行修改,如下:

printf("[%-100s][%d%%]\r", buf, i);

增加打印进度百分比作为数据化进度显示,%%将会转义成一个%打印在屏幕上。

打印的效果如下:

222

最后增添一个旋转光标表示进度条正在不断执行,因此需要对打印再进行修改,得到最终的代码如下:

#include "myproc.h"
#include <string.h>
#include <unistd.h>

#define STYLE '='
#define ARROW '>'
#define SIZE 101

void process()
{
  const char* cursor = "|/-\\";
  char buf[SIZE];
  memset(buf, 0 , SIZE);
  int i = 0;
  while(i <= 100)
  {
    printf("[%-100s][%d%%][%c]\r", buf, i, cursor[i%4]);
    fflush(stdout);
    buf[i++] = STYLE;
    if(i != 100 )buf[i] = ARROW;
    usleep(100000);
  }
  printf("\n");
}

添加了cursor字符串保存旋转光标的样式,其中\\会转义成一个\,因为旋转光标中是将4个字符循环打印因此将样式字符串模4输出。

最终进度条的演示结果如下:

333

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

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

相关文章

车载开发智能座舱技术——【Surface渲染流程】

SurfaceFlinger智能座舱技术是一种车载开发中的创新技术&#xff0c;它能够实现高效的图形渲染和多媒体处理&#xff0c;为驾驶员和乘客提供更好的车内体验。本文将介绍SurfaceFlinger智能座舱技术的概念和原理&#xff0c;并详细解析Surface的渲染流程和相关代码示例。 一、S…

解决多开 sap 瓶颈 需要用同样的权限 打开,都是administrators 或者都是 普通用户

设置排程情况下&#xff0c;用户登录时运行&#xff0c;用最高权限运行 If my problem description is very simple, sorry. But I found the reason: the startup permissions of sap and python are not the same. For example, both of these should be run with admini…

如果室温超导被验证成功,它会是算力的永动机吗?

近期&#xff0c;有韩国科学家团队表示&#xff0c;他们发现了全球首个室温超导材料。室温超导&#xff0c;即在室温条件下实现的超导现象。而“超导”是指导体在某一温度下&#xff0c;电阻为零的状态。 如果室温超导被验证成功且可以被应用&#xff0c;没有电阻的超导体基本不…

Spring Data JPA 的开发神级IDEA插件 -- JPA Buddy

1. 概述 JPA Buddy是一个广泛使用的IntelliJ IDEA插件&#xff0c;面向使用JPA数据模型和相关技术&#xff08;如Spring DataJPA&#xff0c;DB版本控制工具&#xff08;Flyway&#xff0c;Liquibase&#xff09;&#xff0c;MapStruct等&#xff09;的新手和有经验的开发人员…

SAP从入门到放弃系列之凭证批次(Documentary Batches)-Part1

目录 一、概述二、配置三、测试3.1 采购入库3.2 生产投料3.3 批次追溯 一、概述 凭证批次只是一个虚拟的批次&#xff0c;库存是不做批次管理的&#xff0c;但是通过虚拟批次可以做到物料的可追溯性。相对启用批次管理来说库存管理成本比&#xff0c;工作量更小&#xff0c;复…

通过私有化部署的企业智能名片,作用究竟有多大?

“在21世纪最为重要的是什么&#xff1f;” “是人才&#xff0c;更是人脉。” 为了拓展人际关系&#xff0c;建立更密切的联系和合作联络。在商务交流中&#xff0c;互相交换正式、可信的名片是必不可少的一环。 但是&#xff0c;你有没有意识到呢&#xff1f; 每年全球交换…

Pre-trained models for natural language processing: A survey(NLP领域预训练模型研究综述)

Pre-trained models for natural language processing: A survey(NLP领域预训练模型研究综述)_笔记 零、摘要 简洁的介绍了语言表征学习的研究进展&#xff0c;以及描述了如何将PTMs&#xff08;pre-training models&#xff09;应用于下游任务&#xff0c;并概述了未来的潜在…

树莓派更换软件源

​ 目录 1、备份源列表&#xff1a;在更改软件源之前&#xff0c;最好备份你当前的源列表文件。 2、编辑源列表文件&#xff1a;使用文本编辑器&#xff08;例如nano或vi&#xff09;打开/etc/apt/sources.list文件。 3、更换软件源&#xff1a;在文件中找到原始的官方源地…

串讲Maven本地仓库、私服、中央仓库

前言介绍 近期整理材料和搭建平台环境&#xff0c;重新系统了解了Maven一整套流程。特整理如下&#xff1a; 图1 图中分本地仓库和远程仓库&#xff1a; 本地仓库&#xff1a;自己电脑上存储资源的仓库&#xff0c;连接远程仓库获取资源。 远程仓库&#xff1a;非本机电脑上…

【多模态】ALIGN——使用噪声文本数据进行视觉语言感知预训练

ALIGN: A Large-scale ImaGe and Noisy-text embedding 目录 &#x1f36d;&#x1f36d;1.网络介绍 &#x1f36d;&#x1f36d;2.大规模噪声图像文本数据集 &#x1f438;&#x1f438;2.1图像过滤器 &#x1f438;&#x1f438;2.2文本过滤器 &#x1f36d;&#x1f3…

ubuntu服务器配置ftp服务

需求&#xff1a;配置ftp服务用于在windows电脑上直接浏览、下载、上传ubuntu服务器上的文件&#xff0c;用于文件共享&#xff0c;方便实用 效果&#xff1a;用户打开windows资源管理器后输入ftp://xxx.xxx.xxx.xxx &#xff08;公网IP地址&#xff09;后&#xff0c;即可浏览…

《在细雨中呼喊》阅读笔记

《在细雨中呼喊》阅读笔记 2023年2月5号在家读完&#xff0c;本书就是以作者者回忆的形式来写&#xff0c;男一号叫孙光林&#xff0c;有一个哥哥孙光平&#xff0c;一个弟弟叫孙光明&#xff0c;父亲叫孙光才。书中写了四篇故事。 第一篇写的就是作者对于老家生活的回忆 小的时…

问道管理:股票总市值高好还是低好?

股票的总市值是指公司一切流通股票的总价值。在股票交易商场中&#xff0c;总市值一般是考虑一家公司在商场上的规模和影响力的重要指标之一。可是&#xff0c;总市值在股票投资中究竟是高好仍是低好呢&#xff1f;以下从几个视点进行分析。 商场份额视点 从商场份额的视点来看…

【解放ipad生产力】如何在平板上使用免费IDE工具完成项目开发

前言 很多人应该会像我一样吧&#xff0c;有时候身边没电脑突然要写项目&#xff0c;发现自己的平板没有一点作用&#xff0c;毫无生产力可言&#xff0c;在了解了几家IDE工具后&#xff0c;给大家罗列出来&#xff0c;根据自己的需求进行挑选 现在IDE工具不少&#xff0c;像l…

easyexcel 导出下拉框

官方文档&#xff1a;https://github.com/alibaba/easyexcel 目标&#xff1a;导出的 excel 是下拉框 maven 导入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version> &…

右值引用带来的效率提升(C++11)

文章目录 一.左值引用和右值引用二.C11区分左值和右值的语法设计意义--对象的移动构造和移动赋值场景分析1:C11之前C11之后 场景分析2:函数std::move右值引用的广泛使用 三.引用折叠 一.左值引用和右值引用 左值:可以取到地址的对象(可以出现在赋值符号的左边),对左值的引用称…

“Rust难学”只是一个谎言

近年来Rust的存在感日渐升高&#xff0c;但是其陡峭的学习曲线似乎总是令人望而生畏。不过谷歌的一项内部调查表明&#xff0c;关于Rust的“难学”或许只是一种谣传。 Rust到底难不难学&#xff1f;谷歌有了Go&#xff0c;为何还要支持Rust&#xff1f;频频陷入内斗的Rust领导…

FPGA学习——蜂鸣器实现音乐播放器并播放两只老虎

文章目录 一、蜂鸣器简介1.1 蜂鸣器分类1.2 PWM 二、C4开发板原理图三、如何产生不同的音调四、代码实现及分析五、总结 一、蜂鸣器简介 1.1 蜂鸣器分类 蜂鸣器一般分为有源蜂鸣器和无源蜂鸣器。二者的区别在于&#xff0c;有源蜂鸣器内部含有振动源和功放电路&#xff0c;只…

【雕爷学编程】 MicroPython动手做(35)——体验小游戏3

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

计算机和汇编语言

1.用电表示数字 我们已经学习过二进制来表示数字 二进制计数采用0和1组合表示数字 0和1很适合使用开关闭合&#xff0c;导线上有电流是1&#xff0c;无电流是 我们还可以加上小灯泡&#xff0c;来表示数 2.二进制加法机 上述这个加法机器是接受左边和下面的输入&#xff0c;把…