玩转Linux进度条

准备工作:

一.关于缓冲区

首先,咱们先来一段有意思的代码:

#include<stdio.h>
#include<unistd.h>
int main()
{
      printf("you can see me");
      sleep(5);

}

你可以在你的本地运行一下,这里我告诉大家运行结果:这一段字符串等到程序运行结束后才被显示出来。有些同学感觉非常震惊,但这就是运行结果。

我们都知道,这段代码是顺序运行结构,就是从前往后依次执行,毫无疑问,这段字符串肯定被优先执行,那么,为什么没有被显示出来?这5秒内,字符串在什么位置?

字符串一直在缓冲取内,等到运行结束时,才被刷新出来。那,怎么才能让字符串在sleep前出现呢?

这里,我说明两种方式:

方式一:

#include<stdio.h>
#include<unistd.h>
int main()
{
      printf("you can see me\n");
      sleep(5);

}

在printf中加入换行符,因为\n默认的是行刷新,

#include<stdio.h>
#include<unistd.h>
int main()
{
      printf("you can see me\n");
      printf("you can see ");
      sleep(5);

}

 我们来运行一下,会发现:第一字符串打印出来了,第二个字符串等到程序结束时,才显示出来!

方式二:

#include<stdio.h>
#include<unistd.h>
int main()
{
      printf("you can see me\n");
      fflush(stdout)
      sleep(5);

}

fflush(stdout)表示手动刷新缓冲区的操作。

二.\r,\n

\r是回车,\n是换行,所以\r\n 是回车换行,但是在语言层面,\n就代表着回车+换行。

 我们举个栗子:

#include<stdio.h>
int main()
{
	printf("aaaaa\r");
	printf("11");
	return 0;
}

运行结果是:

果真像我们分析的那样,程序运行完第一行,"aaaaa"被打印出来,然后光标回到行首,开始打印"11",这个位置原来的数据被后来的数据所覆盖,所以打出来,就是这个样子。

三.关于显示屏

其实,不知道大家有没有好奇过:我们的数字和字母都是怎么出现在显示屏的呢?原理很简单!!

在显示屏看来,不过是字符还是数组还是汉字,都是由字符构成,比如在显示屏上打印出1234,显示屏就把1234看作4个字符,然后点亮这4个字符的光点,所以,我们就看见了1234。

四.制作一个一分钟倒计时

#include<stdio.h>
#include<unistd.h>
int main()
{
	int num = 60;
	while (num)
	{
		printf("%d\r", num);
		fflush(stdout);
		num--;
	}
}

二.制作一个进度条

效果演示:

写在前面,这个进度条,我们准备分文件写,分别为main.cc,process.cc,process.h,下面,将一一介绍各个文件的作用:

进度条代码:

makefile:

myproc:process.cc main.cc 
	gcc -o myproc process.cc main.cc //-o后边的文件默认为生成的文件,其他的都是依赖文件
.PHONY:clean
clean:
	rm -f myproc

main.cc:

#include "process.h"

int main()
{
    myprocess();
    
}

代码so easy!!

process.h:

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


#define Num 101
#define STYLE '#'


const char lable[]="|/-\\";
extern void myprocess();

process.cc:

#include "process.h"


void myprocess()
{
   int cnt=0;
   char buf[Num];
   memset(buf,'\0',sizeof buf);//利用字符串初始化函数,初始化字符串为0;
   while(cnt<Num)
   {

        if(cnt<Num-1)buf[cnt]=TAIL;
        printf("[%-100s][%-3d%%][%c]\r",buf,cnt,lable[cnt%4]);//[%-100s]:先留出100个字符的长度,保证从前往后显示;%%:表示百分号
        buf[cnt++]=STYLE;
       
        fflush(stdout);
        usleep(50000);//usleep:和sleep效果相同,但usleep以微妙为单位,但sleep以秒为单位
   }
 
   printf("\n");
}

3、实现过程分析
 

进度条样式 :
主体样式为两个中括号包裹,中间 => 推进的方式呈现,比如:[======>]
主体右侧中括号位置保持不变,中间元素不断推进,比如:[=> ]
因此我们把中间主体 = 宏定义为 STYLE,把尾侧 > 宏定义为 TAIL

进度条百分比:
显示当前加载进度,用 [rate%] 显示,rate 随着进度条的不断推进而变化,而打印 %(转义字符)则需要两个 %%

进度条旋转字符:
显示加载样式,可以利用一个旋转的字符,例如 [] 的样式,顺时针不断旋转,依次为 “| / - \”,注意 \ 也是转义字符,因此需要两个 \ \,对此我们定义一个lable指针指向常量字符串const char *lable=" | / - \ "

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

android睡眠分期图

一、效果图 做医疗类项目&#xff0c;经常会遇到做各种图表&#xff0c;本文做的睡眠分期图。 二、代码 引入用到的库 api joda-time:joda-time:2.10.1 调用代码 /*** 睡眠* 分期*/private SleepChartAdapter mAdapter;private SleepChartAttrs mAttrs;private List<SleepI…

d2-crud-plus 使用小技巧(六)—— 表单下拉选择 行样式 溢出时显示异常优化

问题 vue2 elementUI d2-crud-plus&#xff0c;数据类型为select时&#xff0c;行样式显示为tag样式&#xff0c;但是如果选择内容过长就会出现下面这种bug&#xff0c;显然用户体验不够友好。 期望 代码 js export const crudOptions (vm) > {return {...columns:…

成功解决“ModuleNotFoundError: No Module Named Pycocotools”错误的全面指南

成功解决“ModuleNotFoundError: No Module Named Pycocotools”错误的全面指南 在Python的数据科学、计算机视觉和机器学习项目中&#xff0c;经常需要用到各种工具和库来加速开发过程。其中&#xff0c;pycocotools 是一个专门用于处理 COCO 数据集的库&#xff0c;它提供了多…

2024年Google算法更新打击低质量(如AI生成)内容后,英文SEO优化人员该如何调整谷歌SEO优化策略?

3月5日&#xff0c;谷歌发布了2024年的首次算法更新。与以往更新不同&#xff0c;本次更新更加复杂&#xff0c;这次更新旨在提高搜索结果的质量和相关性&#xff0c;可能对外贸网站排名和流量产生显著影响。也将产生更大的网站数据波动。但在担心自己的网站数据受到影响之前&a…

Django 里的增删改查

下面是步骤 先更新 urls.py 来添加新的url from django.contrib import admin from django.urls import path from app01 import viewsurlpatterns [path(demo/, views.demo), ]在 models.py 里创建表 from django.db import models# Create your models here. class UserI…

毫米级精度3D人脸扫描设备,助推打造元宇宙虚拟分身

在元宇宙中&#xff0c;虚拟分身对应的是一个三维模型&#xff0c;数字化的过程则是三维重建过程&#xff0c;通过3D人脸扫描可以通过多相机同步采集人脸部&#xff0c;可快速、准确地重建出真人地脸部模型及贴图&#xff0c;通过3D人脸扫描设备可快速重建出高逼真的虚拟分身。…

BioTech - 使用 Kubeflow 多机多卡 运行 高精度蛋白质结构的迭代预测

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/139418138 核心逻辑,参考:使用 循环(Recycle)迭代的蛋白质结构预测 获取 高精度结构 Kubeflow 是一个开源的 Kubernetes 原生框架,专注于简化、可移植和可…

【反悔贪心】算法讲解

目录 cf865D 环形喂猪 建筑抢修 cf865D 思路&#xff1a; 我们贪心的原则是尽可能的多卖&#xff0c;而且尽可能的卖的多。 整体的贪心思路就是能卖就卖&#xff0c;卖完后放入堆中&#xff08;以便反悔&#xff09;&#xff0c;先不考虑能卖多少&#xff0c;因为堆是按照价…

02--nginx代理缓存

前言&#xff1a;比较常用的用法反向代理&#xff0c;和缓存的一些操作&#xff0c;用虚拟环境复刻出来&#xff0c;里面参数不用详细记录&#xff0c;用作复习&#xff0c;使用时直接查找即可。环境搭建过程参考前一篇文章nginx基础。 1、基础环境 IP角色作用192.168.189.143…

AWR设置工程仿真频率、原理图仿真频率、默认单位

AWR设置工程仿真频率、原理图仿真频率、默认单位 生活不易&#xff0c;喵喵叹气。马上就要上班了&#xff0c;公司的ADS的版权紧缺&#xff0c;主要用的软件都是NI 的AWR&#xff0c;只能趁着现在没事做先学习一下子了&#xff0c;希望不要裁我。 最近稍微学习了一下AWR这个软…

参加质量源于设计QbD培训能学到什么

近年来&#xff0c;产品质量已经成为了企业能否立足市场的关键。因此&#xff0c;质量源于设计&#xff08;QbD&#xff09;的理念应运而生&#xff0c;它强调在产品开发初期就注重质量设计&#xff0c;以最大限度地降低潜在风险&#xff0c;提高产品的稳定性和可靠性。参加质量…

诺亚财富——财富管理行业的进化逻辑

詹姆斯•卡斯的著作《有限与无限的游戏》中&#xff0c;传递出这样一种观点&#xff1a; “有限的游戏&#xff0c;其目的在于赢得胜利&#xff1b;无限的游戏&#xff0c;却旨在让游戏永远进行下去。有限的游戏在边界内玩&#xff0c;无限的游戏玩的就是边界。” 在商业社会…

我的app开始养活我了

大家在日常使用各类 app 时应该会发现&#xff0c;进入 app 会有个开屏广告&#xff0c;在使用 app 中&#xff0c;时不时的也会有广告被我们刷到。 这时候如果我们看完了这个广告&#xff0c;或者点击了这个广告的话&#xff0c;app商家就会获得这个广告的佣金。 这个佣金就是…

用WebStorm和VS Code断点调试Vue

大家好&#xff0c;我是咕噜铁蛋&#xff01;。今天&#xff0c;我想和大家分享一下如何在WebStorm和VS Code这两款流行的开发工具中&#xff0c;使用断点调试Vue.js项目。Vue.js作为前端三大框架之一&#xff0c;以其轻量级和组件化的特性&#xff0c;受到了广大开发者的喜爱。…

18、matlab信号生成与预处理--剔除异常值:hampel()函数

1、语法 说明&#xff1a;对输入向量x应用Hampel滤波器来检测和去除异常值。 1&#xff09;y hampel(x) 参数&#xff1a;x&#xff1a;输入信号 y:预处理的输出信号 对于x的每个样本&#xff0c;函数计算由样本及其周围的六个样本组成的窗口的中位数&#xff0c;每边三…

Linux下的Git应用及配置

1、卸载 2、安装 3、创建并初始化 4、配置 &#xff08;附加删除语句&#xff09; 5、查看&#xff08;tree .git/&#xff09; 6、增加和提交 7、打印日志 8、验证已操作工作

LeetCode刷题:反转链表

leetCode真题 206. 反转链表 属于基础简单题目 常见的做法有递归和while循环 递归 // 1. 递归参数和返回值public static ListNode reverseList(ListNode head) {// 1. 递归终止条件if (head null || head.next null) {return head;}// 递归逻辑ListNode last reverseL…

安全攻防知识——CTF之MISC

前言&#xff1a; 本周技术分享将介绍安全攻防知识中的MISC部分。MISC&#xff0c;中文即杂项&#xff0c;包括隐写、数据还原、脑洞、社会工程、压缩包解密、流量分析取证、与信息安全相关的大数据等。让我们一起来了解更多吧&#xff01; 一&#xff09;文件结构简介 1.常见…

手把手制作Vue3+Flask全栈项目 全栈开发之路实战篇 问卷网站(一)login页面

全栈开发一条龙——前端篇 第一篇&#xff1a;框架确定、ide设置与项目创建 第二篇&#xff1a;介绍项目文件意义、组件结构与导入以及setup的引入。 第三篇&#xff1a;setup语法&#xff0c;设置响应式数据。 第四篇&#xff1a;数据绑定、计算属性和watch监视 第五篇 : 组件…

Memory测试工具-lmbench使用详解

✨前言&#xff1a; 什么是lmbench&#xff1f; lmbench 是一个广泛使用的、开源的系统性能测量工具&#xff0c;它能对Unix-like操作系统&#xff08;包括Linux、BSD等&#xff09;进行全面的性能测试。这个套件包含了一系列针对不同系统组件&#xff08;如处理器、内存、文件…