【Linux系统编程】第十四弹---进度条

news2024/11/26 9:31:35

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】【C++详解】【Linux系统编程】

目录

1、回车和换行

2、观察回车换行现象

3、缓冲区

4、usleep和fflush函数

5、简单倒计时

6、进度条

6.1、版本一

6.2、版本二

总结


1、回车和换行

回车:

指光标由行中任意位置移动到行首。

换行:

指换到下一行的情况。

\r:只进行回车

\n:进行回车和换行

2、观察回车换行现象

1.执行下面代码

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

 现象:

打印完字符串,然后休眠3秒,最后结束程序。

2.执行下面代码

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

 现象:

休眠3秒,程序就结束了。

为什么使用\r就不能字符串了呢???

这会牵扯到缓冲区的知识,我们在写一个缓冲区的点来详细讲解!!! 

 补充查询手册:

输入命令:

mam 3 sleep   # 三号手册才能查到我们想用的sleep

3、缓冲区

概念:

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

那为什么字符串结尾有\n就会打印字符串,而有\r则不打印字符串呢???

由于显示器模式是行刷新缓冲区是按行缓冲的。而字符串是先拷贝在内存空间中,当遇到\n的时候,就会强制把字符串刷新到显示器文件上,因此就看到该字符串了。

而字符串后面是\r的情况,不会强制把字符串刷新到显示器,但是当遇到return 0;时,会强制刷新到显示器上,但是由于\r 会回到行首后,会进行覆盖写,shell 提示符会覆盖掉之前写的 “hello world”。

注意:缓冲区满了也会刷新缓冲区。

如果我们想自己手动刷新缓冲区该怎么办呢???

可以通过调用刷新缓冲区的函数,我们在下面通过代码进行讲解。

4、usleep和fflush函数

我们可以通过man手册先查询两个函数的基本用法。

1. usleep函数

功能:

以微秒为间隔暂停执行,头文件为#include<unistd.h>

2.fflush函数

功能:

重刷一个流。

stdout -- 标准输出流 -- 屏幕

stdin -- 标准输入流 -- 键盘

stderr -- 标准错误流 -- 屏幕

3.代码演示

#include<stdio.h>
#include<unistd.h>
int main()
{
    printf("hello linux\r");
    fflush(stdout); # 强制刷新输出流
    sleep(3);       # 休眠3秒
    return 0;
}

现象:

先打印字符串,然后休眠3秒,字符串被shell提示符覆盖。 

 

5、简单倒计时

 通过上面的简单重刷输出流,我们可以做一个简单的倒计时程序。

要求:实现一个从10到0的倒计时效果。

代码:

#include<stdio.h>
#include<unistd.h>
int main()
{
   int cnt = 10;
   while(cnt >= 0)
   {
       printf("%-2d\r",cnt);// 以2位的固定位宽输出且左对齐方式打印
       fflush(stdout);//重刷缓冲区
       sleep(1);//休眠1秒,只有休眠才能看到倒计时的效果
       cnt--;
   }
   printf("\n");
   return 0;
}

分析:

1. 定义倒计时变量 cnt,让其逐渐递降。
2. 核心就是用 \r 回到缓冲区行首进行覆盖写,然后fflush不断刷新出出来,但是只是刷新并不能看到效果,因为它会直接被覆盖,因此需要休眠一会,几秒自己设置。
3. 格式调整,打印 cnt==10 时,在缓冲区打印的其实是字符1和字符0,如果我们不用 %2d(以2位的固定位宽输出) 来调整格式,而用 d% 的话,那么覆盖写只会覆盖第一位字符 1  的位置,而第二位的字符 0  还留在缓冲区原来的位置,于是倒计时便会变为下面这样
10->90->80->70->60->50->40->30->20->10->00 ,-2d% 加个负号保证其向左对齐。
4. 倒计时完加个 \n符,shell 提示符就不会覆盖倒计时。

6、进度条

6.1、版本一

此处我们安装C语言中的分文件实现此进度条,加上我们Linux中学习的makefile工具。

首先我们创建四个文件:processbar.c  processbar.h  main.c  makefile

processbar.c : 进度条函数的实现。

processbar.h : 进度条函数的声明,头文件包含。

main.c : 调用.h文件中的方法 。

makefile : 自动化编译。

进度条效果:

  • 第一个中括号就是表示进度条。
  • 第二个中括号表示进度。
  • 第三个表示旋转样式。

原理基本跟倒计时一样。

[jkl@VMCentos7 process]$ touch processbar.h processbar.c main.c makefile  # 创建四个文件
[jkl@VMCentos7 process]$ ls
main.c  makefile  processbar.c  processbar.h

 makefile文件代码:

processbar:processbar.c main.c
    gcc -o $@ $^
.PHONY:clean
clean:
    rm -f processbar

processbar.h代码:

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

void ProcBar();

processbar.c代码:

#include "processbar.h"                                                                                                 
  
//字符串长度
#define Length 101
#define Style '#' //表示进度条的符号

const char* label="|/-\\";//两个\\表示一个\,表示旋转样式

//version1
void ProcBar()
{
    char bar[Length];//缓冲区长度 
    memset(bar,'\0',sizeof(bar));//将缓存区空间都改为\0
    int len=strlen(label);//字符串长度
    //循环往缓存区输入#
    int cnt=0;
    while(cnt<=100)
    {
        printf("[%-100s][%3d%%][%c]\r",bar,cnt,label[cnt%len]);
        fflush(stdout);
        bar[cnt++]=Style;
        usleep(30000);//休眠30000微秒,秒太长了
    }
    printf("\n");
}

main.c代码:

#include "processbar.h"                                                                                                 
  
int main()
{
    ProcBar();
    return 0;
}

运行中的效果: 

 最后的效果:

6.2、版本二

 在我们的实际生活中,进度条一般不会单独出现,常出现在下载界面和游戏界面,因此版本二通过下载场景来进行展示。

 makefile文件代码:

download:download.c test.c
    gcc -o $@ $^
.PHONY:clean
clean:
    rm -f download

download.h代码:

#pragma once

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

typedef void(*callback_t)(double, double);//函数指针


//void ProcBar();
void ProcBar(double total, double current);

download.c代码:

#include"download.h"

#define Length 101
#define Style '='

const char *lable = "|/-\\";



//version 2
void ProcBar(double total, double current)
{
    char bar[Length];
    memset(bar, '\0', sizeof(bar));
    int len = strlen(lable);

    int cnt = 0;
    double rate = (current*100.0)/total;
    int loop_count = (int)rate;
    while(cnt <= loop_count)
    {
        bar[cnt++] = Style;
        //usleep(20000);
    }
    printf("[%-100s][%.1lf%%][%c]\r", bar, rate, lable[cnt%len]);
    fflush(stdout);
}

test.c代码:

​#include"download.h"

double bandwidth = 1024*1024*1.0;

//download
void download(double filesize,callback_t cb)
{
    double current = 0.0;

    printf("download begin, current: %lf\n", current);
    while(current <= filesize)
    {
        cb(filesize, current);
        //从网络中获取数据
        usleep(100000);
        current += bandwidth;
    }
    printf("\ndownload done, filesize: %lf\n",filesize);
}

int main()
{
    download(100*1024*1024,ProcBar);
    download(2*1024*1024,ProcBar);
    return 0;
}

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

【数据结构】单链表专题详细分析

与其临渊羡鱼&#xff0c;不如退而结网。&#x1f493;&#x1f493;&#x1f493; 目录 •✨说在前面 &#x1f34b;知识点一&#xff1a;什么是链表&#xff1f; • &#x1f330;1.链表的概念 • &#x1f330;2.链表的结构 • &#x1f330;3.链表的分类 &#x1f34b;…

青动CRM源码搭建/部署/上线/运营/售后/更新

CRM是一款基于thinkphpfastadmin开发的客户管理系统。旨在助力企业销售全流程精细化、数字化管理&#xff0c;全面解决企业销售团队的全流程客户服务难题&#xff0c;帮助企业有效盘 活客户资源、量化销售行为&#xff0c;合理配置资源、建立科学销售体系&#xff0c;提升销售业…

无限免费泛域名SSL证书申请

如今https访问已经成为了网络安全的标识&#xff0c;SSL证书也成为了保护网站内用户信息安全和加密信息交互的手段之一。自2019年等保2.0的相应政策出台后&#xff0c;实现网站https访问也是必经环节之一。 当下SSL证书的相关政策也一直备受关注&#xff0c;有免费的SSL证书也…

【OV SSL证书】OV证书为什么更贵,又好在哪里?

证书类型有三种&#xff0c;分别是DV证书、OV证书、EV证书&#xff0c;本文将具体讲解OV证书的优点。 一、OV 证书的介绍 OV证书&#xff1a;企业验证型证书&#xff0c;证书审核方式为通过验证域名所有权和申请企业的真实身份信息才能签发证书。目前OV类型证书是全球运用最广…

Java的事件处理机制

Java事件处理机制 Java事件处理是采取“委派事件模型”。当事件发生时&#xff0c;产生事件的对象&#xff0c;会把此“信息”传递给“事件的监听者”处理&#xff0c;这里所说的“信息”实际上就是java.awt.event事件类库里某个类所创建的对象&#xff0c;把它称为“事件的对…

打包手动分包

手动分包 {ignore} 基本原理 手动分包的总体思路是&#xff1a; 先单独的打包公共模块 公共模块会被打包成为动态链接库(dll Dynamic Link Library)&#xff0c;并生成资源清单 根据入口模块进行正常打包 打包时&#xff0c;如果发现模块中使用了资源清单中描述的模块&…

基于 Llama-Index、Llama 3 和 Qdrant,构建一个 RAG 问答系统!

构建一个使用Llama-Index、Llama 3和Qdrant的高级重排-RAG系统 尽管大型语言模型&#xff08;LLMs&#xff09;有能力生成有意义且语法正确的文本&#xff0c;但它们面临的一个挑战是幻觉。 在LLMs中&#xff0c;幻觉指的是它们倾向于自信地生成错误答案&#xff0c;制造出看似…

人脸图像生成(DCGAN)

一、理论基础 1.什么是深度卷积对抗网络&#xff08;Deep Convolutional Generative Adversarial Network&#xff0c;&#xff09; 深度卷积对抗网络&#xff08;Deep Convolutional Generative Adversarial Network&#xff0c;DCGAN&#xff09;是一种生成对抗网络&#xf…

跨域问题(服务器和浏览器之间)待补充

一、为什么产生&#xff1a; 同源策略&#xff08;域名&#xff0c;协议&#xff0c;端口&#xff09;&#xff0c;安全问题 二、怎么解决&#xff1a; 1、cros:修改响应头 2、jp&#xff1a;采用js标签 3、代理&#xff08;创建服务器&#xff0c;定义规则&#xff0c;服…

十二届蓝桥杯Python组1月中/高级试题 第五题

** 十二届蓝桥杯Python组1月中/高级试题 第五题 ** 第五题&#xff08;难度系数 5&#xff0c;35 个计分点&#xff09; 提示信息&#xff1a; 平均数&#xff1a;是指在一组数据中所有数据之和再除以这组数据的个数。 如&#xff1a;“1&#xff0c;2&#xff0c;3&#xf…

安防监控/视频汇聚系统EasyCVR+AI智能分析助力解决校园霸凌事件

一、方案背景 校园霸凌这一校园中不应存在的现象&#xff0c;却屡见不鲜&#xff0c;它像一把锋利的刀&#xff0c;深深地刺入那些无辜的心灵&#xff0c;让受害者承受着无尽的痛苦。随着科技的进步与发展&#xff0c;我们应该追求有效、进步的手段来阻止校园霸凌事件的发生&a…

达坦科技@了你,并邀请你参加2024开源之夏!

开源之夏&#xff08;英文简称“OSPP”&#xff09;是中科院软件所“开源软件供应链点亮计划”指导下的系列暑期活动。达坦科技自开源之夏创办首期起每年参与&#xff0c;积极鼓励在校学生积极参与开源软件的开发维护&#xff0c;培养和发掘更多优秀的开发者。今年&#xff0c;…

超越机械抓手:看多指机器人如何灵活运用触觉?

论文标题&#xff1a; Learning Visuotactile Skills with Two Multifingered Hands 论文作者&#xff1a; Toru Lin, Yu Zhang, Qiyang Li, Haozhi Qi, Brent Yi, Sergey Levine, and Jitendra Malik 1. 机器人新挑战&#xff1a;多指手指操作 在自动化和智能化日益普及的…

【Vulhub靶场】Nginx 中间件漏洞复现

【Vulhub靶场】Nginx 中间件漏洞复现 一、Nginx 文件名逻辑漏洞&#xff08;CVE-2013-4547&#xff09;1. 影响版本2. 漏洞原理3. 漏洞复现 二、Nginx越界读取缓存漏洞&#xff08;CVE-2017-7529&#xff09;1. 漏洞详情2. 影响版本3. 漏洞复现 三、Nginx 配置错误导致漏洞&…

预告 | 飞凌嵌入式邀您共聚2024上海充换电展

第三届上海国际充电桩及换电站展览会&#xff08;CPSE&#xff09;&#xff0c;即将于5月22日~24日在上海汽车会展中心举行。届时&#xff0c;飞凌嵌入式将带来多款嵌入式核心板、开发板、充电桩TCU以及储能EMS网关产品&#xff0c;与来自全国的客户朋友及行业伙伴一同交流分享…

基于R语言绘图 | 转录代谢趋势图绘制教程

原文链接&#xff1a;基于R语言绘图 | 转录代谢趋势图绘制教程 本期教程 小杜的生信笔记&#xff0c;自2021年11月开始做的知识分享&#xff0c;主要内容是R语言绘图教程、转录组上游分析、转录组下游分析等内容。凡事在社群同学&#xff0c;可免费获得自2021年11月份至今全部…

【ArcGIS Pro微课1000例】0058:玩转NetCDF多维数据集

一、NetCDF介绍 NetCDF(network Common Data Form)网络通用数据格式是由美国大学大气研究协会(University Corporation for Atmospheric Research,UCAR)的Unidata项目科学家针对科学数据的特点开发的,是一种面向数组型并适于网络共享的数据的描述和编码标准。NetCDF广泛应…

羊大师:当代年轻人如何应对压力

羊大师&#xff1a;当代年轻人如何应对压力 当代年轻人面临各种压力&#xff0c;包括工作、学习、人际关系、经济等方面的压力。以下是一些建议&#xff0c;帮助年轻人应对这些压力&#xff1a; 认识并接受压力&#xff1a; 首先要认识到压力是生活中不可避免的一部分。 尝试…

WPF之DataGird应用

1&#xff0c;DataGrid相关属性 GridLinesVisibility&#xff1a;DataGrid网格线是否显示或者显示的方式。HorizontalGridLinesBrush&#xff1a;水平网格线画刷。VerticalGridLinesBrush&#xff1a;垂直网格线画刷。HorizontalScrollBarVisibility&#xff1a;水平滚动条可见…

卷积通用模型的剪枝、蒸馏---蒸馏篇--RKD关系蒸馏(以deeplabv3+为例)

本文使用RKD实现对deeplabv3+模型的蒸馏;与上一篇KD蒸馏的方法有所不同,RKD是对展平层的特征做蒸馏,蒸馏的loss分为二阶的距离损失Distance-wise Loss和三阶的角度损失Angle-wise Loss。 一、RKD简介 RKD算法的核心是以教师模型的多个输出为结构单元,取代传统蒸馏学习中以教…