Linux小程序--进度条

这篇具有很好参考价值的文章主要介绍了Linux小程序--进度条。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.知识补充

1.1回车和换行 

1.2缓冲区

2.实现倒计时 

3.实现进度条 


1.知识补充

1.在制作小程序进度条之前,我们先了解一下,回车换行和行缓冲区的概念。

2.动态效果,在同一个位置刷新不同的图像,实现一个倒计时的效果。

3.有了上面的基础我们就可以实现进度条了


1.1回车和换行 

Linux小程序--进度条,Linux学习,linux,运维,服务器

所以说回车和换行是两个动作。

Linux小程序--进度条,Linux学习,linux,运维,服务器Linux小程序--进度条,Linux学习,linux,运维,服务器

这是老式键盘。

在C语言中,\r表示的是只回车,\n表示的是只换行。


1.2缓冲区

看下面两段代码:

运行这个代码发现:printf打印的内容显示三秒后程序结束

Linux小程序--进度条,Linux学习,linux,运维,服务器

运行这个代码发现:等待三秒后显示printf打印的内容程序结束

Linux小程序--进度条,Linux学习,linux,运维,服务器

是因为下面子这段代码先执行sleep函数吗?当然不是,C语言的代码都是从上往下执行的,那为什么下面的代码是先暂停三秒然后才进行打印的呢?

这是因为在sleep期间,字符串进入了缓冲区。

缓冲区是计算机中用于临时存储数据的内存区域。在输入/输出操作中,数据通常不会立即传输到目的地,而是先存储在缓冲区中,以提高效率。缓冲区主要分为输入缓冲区和输出缓冲区:

1. **输入缓冲区**:用于存储从输入设备(如键盘、鼠标、文件等)读取的数据,直到程序准备处理这些数据。例如,当你输入文本时,字符会被存储在输入缓冲区中,直到程序读取并处理这些字符。

2. **输出缓冲区**:用于存储程序要发送到输出设备(如屏幕、打印机、文件等)的数据,直到达到一定条件时才会将数据发送到目的地。例如,当程序使用 printf 函数打印文本时,文本会先存储在输出缓冲区中,直到缓冲区满了、遇到换行符或调用 fflush 函数时才会将数据刷新到屏幕上。

在前面的例子中,由于 printf 函数打印的文本被存储在输出缓冲区中,而在调用 sleep(3) 函数之前并没有刷新缓冲区,所以你会看到在暂停3秒后才会将文本显示出来。这展示了缓冲区在程序执行过程中的作用。缓冲区的使用可以提高I/O操作的效率,但有时也需要注意缓冲区的刷新以避免数据延迟显示或丢失。

程序结束的时候,一般自动冲刷缓冲区。缓冲区满了也会进行刷新。

包含\n之前的字符会立即刷新。

还有一种情况,我既不想缓冲区满了才刷新,我也不想带\n进行刷新,该怎么办呢?


如果你想在不等待缓冲区满了或不使用换行符的情况下立即刷新输出缓冲区,你可以使用 fflush(stdout) 函数来手动刷新标准输出缓冲区。这样可以确保缓冲区中的内容立即被输出到屏幕上,而不必等待缓冲区满或遇到换行符。以下是一个示例代码:

Linux小程序--进度条,Linux学习,linux,运维,服务器

这个示例中, fflush(stdout) 函数用于手动刷新标准输出缓冲区,确保在暂停3秒之前将文本立即显示在屏幕上。这样你就可以在需要时控制何时刷新输出缓冲区,而不必等待缓冲区满或使用换行符。


2.实现倒计时 

 如何实现倒计时?

在同一个位置不断的刷新数字,如何做到?

输出一个数字,然后使用回车重新回到原来的位置(为了让数字变动的慢一些,我们设置sleep为1s,代码示例:

Linux小程序--进度条,Linux学习,linux,运维,服务器

我们运行代码发现,什么数字都没有显示,程序10s后结束,这是因为出现在缓冲区还没有刷新就被覆盖掉了,所有我们要使用fflush函数刷新缓冲区

Linux小程序--进度条,Linux学习,linux,运维,服务器

这样程序就有倒计时的效果了。

Linux小程序--进度条,Linux学习,linux,运维,服务器

但如果是超过一个位数的这是就要控制回车移动的位置了:

eg:20s倒计时

Linux小程序--进度条,Linux学习,linux,运维,服务器

Linux小程序--进度条,Linux学习,linux,运维,服务器


3.实现进度条 

准备工作:

Linux小程序--进度条,Linux学习,linux,运维,服务器

第一个文件负责进度条功能的实现,第二个文件负责进度条功能的声明,第三个文件负责进度条的运行测试。Makefile负责进度条的自动化构建。

Linux小程序--进度条,Linux学习,linux,运维,服务器

什么样的进度条:

Linux小程序--进度条,Linux学习,linux,运维,服务器

我们在第一个位置预留100个字符的空间(显示进度条在增加),第二个位置显示进度,第三个位置有一个旋转的光标以表示在加载中。。。

首先定义一个char数组,memset全初始化为"\0",这时我们就一个一个的往数组中填写”#"

(间隔1s)表示进度条的增加

Linux小程序--进度条,Linux学习,linux,运维,服务器

初步效果:确实在增加,但我们只需要他在一行中不断的打印

Linux小程序--进度条,Linux学习,linux,运维,服务器

我们通过回车去覆盖,然后让缓冲区不断的刷新,这就有了只在一行中不断增加的效果

+、Linux小程序--进度条,Linux学习,linux,运维,服务器

Linux小程序--进度条,Linux学习,linux,运维,服务器

我们在运行的过程中发现1s的间隔太慢,在这里我们将sleep函数换成(usleep)函数,间隔单位为微秒。(这里间隔换算为秒为:0.02s)

Linux小程序--进度条,Linux学习,linux,运维,服务器

我们在显示的时候发现,进度条的框是随着进度的增加而变大的,这样的效果不太好看,因此我们直接预留100字符大小的框,这时我们再打印的时候就会发现框是有100个字符“#”的长度,但是进度条是从右往左增加的,这时因为字符默认是右对齐的,加上-变成左对齐。

Linux小程序--进度条,Linux学习,linux,运维,服务器

Linux小程序--进度条,Linux学习,linux,运维,服务器

这时候我们还可以在后面加上显示进度了百分之多少,在Linux中打印%,只需要输入连续的两个%:

Linux小程序--进度条,Linux学习,linux,运维,服务器

Linux小程序--进度条,Linux学习,linux,运维,服务器

最后我们将正在加载的效果显示出来:原理和倒计时一样,为了达到旋转的效果,我们将用几个方向的线顺序的出现来达到旋转的视觉效果

Linux小程序--进度条,Linux学习,linux,运维,服务器

在这里模len是为了防止数组的越界

Linux小程序--进度条,Linux学习,linux,运维,服务器

Linux小程序--进度条,Linux学习,linux,运维,服务器

这时就有了旋转的效果了。

完整代码:文章来源地址https://www.toymoban.com/news/detail-833122.html

#include <unistd.h>
#include <string.h>
int main()
{
	int i = 0;
	char bar[102];
	memset(bar, 0, sizeof(bar));
	const char* lable = "|/-\\";
	while (i <= 100) {
		printf("[%-100s][%d%%][%c]\r", bar, i, lable[i % 4]);
		fflush(stdout);
		bar[i++] = '#';
		usleep(10000);
	}
	printf("\n");
	return 0;
}

到了这里,关于Linux小程序--进度条的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(53)
  • [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    [1Panel]开源,现代化,新一代的 Linux 服务器运维管理面板

    本期测评试用一下1Panel这款面板。1Panel是国内飞致云旗下开源产品。整个界面简洁清爽,后端使用GO开发,前端使用VUE的Element-Plus作为UI框架,整个面板的管理都是基于docker的,想法很先进。官方还提供了视频的使用教程,本期为大家按照本专栏的基本内容进行多方面的测评。

    2024年02月07日
    浏览(34)
  • Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    Linux服务器常见运维性能测试(3)CPU测试super_pi、sysbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月02日
    浏览(33)
  • 华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    华为云云耀云服务器L实例评测 | Linux系统宝塔运维部署H5游戏

    本章节内容,我们主要介绍华为云耀服务器L实例,从云服务的优势讲起,然后讲解华为云耀服务器L实例资源面板如何操作,如何使用宝塔运维服务,如何使用运维工具可视化安装nginx,最后部署一个自研的H5的小游戏(6岁的小朋友玩的很开心😁)。 前端的同学如果想把自己

    2024年02月07日
    浏览(16)
  • 【Linux学习笔记】Linux服务器:配置与管理samba服务器

    【Linux学习笔记】Linux服务器:配置与管理samba服务器

    一、【linux学习笔记】红帽Linux 7.8系统在虚拟机上的安装 二、【Linux学习笔记】Linux系统的基本操作  三、【Linux学习笔记】管理Linux操作系统:用户管理  四、【Linux学习笔记】管理Linux操作系统:磁盘管理 五、【Linux学习笔记】管理Linux操作系统:软件安装  六、 【Linux学习

    2024年02月02日
    浏览(55)
  • Linux+服务器后台运行程序

    Linux+服务器后台运行程序

    在Linux服务器直接运行程序,程序运行的时间较长,程序经常会因为网络连接问题异常终止,一直盯着程序运行又费时费力,这时后台运行程序是更好的解决方式。But,如果服务器重启了,那所有进程都断掉了,只能重新跑代码。 screen 假如遇到一些比较费时间的程序,但是又

    2024年02月22日
    浏览(17)
  • 【Linux】从云服务器购买到第一个Linux程序

    【Linux】从云服务器购买到第一个Linux程序

    目录 1. 我们为什么要学Linux 2. 云服务器购买 3. 远程连接云服务器 4. 如何创建新用户   5. 第一个Linux程序 总结: 写在最后: 作为一个程序员,你必须学好Linux,至于为什么,这个问题, 在我们日后的学习中,自然会慢慢展现出来,而校招对于Linux也有掌握的要求, 所以我们

    2023年04月15日
    浏览(13)
  • 【Linux环境搭建】从云服务器购买到第一个Linux程序

    【Linux环境搭建】从云服务器购买到第一个Linux程序

    目录 1. 我们为什么要学Linux 2. 云服务器购买 3. 远程连接云服务器 4. 如何创建新用户   5. 第一个Linux程序 总结: 写在最后: 作为一个程序员,你必须学好Linux,至于为什么,这个问题, 在我们日后的学习中,自然会慢慢展现出来,而校招对于Linux也有掌握的要求, 所以我们

    2023年04月17日
    浏览(12)
  • 深度学习服务器(Linux)开发环境搭建教程

    深度学习服务器(Linux)开发环境搭建教程

    当你拿到一台服务器的使用权时,最头疼的莫过于登陆服务区并配置开发环境。本文将从0开始,讲述一台刚申请的服务器远程登陆并配置开发环境的全过程。希望对你有所帮助 打开MobaXterm软件,创建一个新的Session,选择SSH登陆。其中Remote host填服务器的IP地址,Specify userna

    2024年02月05日
    浏览(14)
  • 连接云服务器及Linux常用指令学习

    连接云服务器及Linux常用指令学习

    1、通过系统终端连接云服务器(需要有ssh) win+R,输入cmd进入终端 输入命令:ssh ubuntu@ip号,注意:腾讯云服务器默认用户为ubuntu而阿里云默认用户为root                    2、通过XShell连接云服务器  点击连接后会弹出一个弹框需要填写用户名,腾讯云服务器填ubuntu,阿里

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包