Linux小程序:倒计时和进度条

news2024/10/6 0:33:57

Linux小程序

在Linux中我们实现两个小程序来体会\r和\n的区别,以及缓冲区是什么?

文章目录

  • Linux小程序
  • 前言
    • 回车和换行的区别
    • 缓冲区
  • 小程序的实现
    • 倒计时程序
    • 进度条程序
  • 总结


前言

回车和换行的区别

对于 \r 和 \n 的理解:

  • \n 表示换行且回到下一行的最开始的位置
  • \r 表示的是回车,即将光标回到当前行最开始的位置

在这里插入图片描述

在C语言中,我们单单使用“\n”就可以实现换行回车,但是”\r“只能表示回车

//在定义中\n表示的是换行符号,只是在语言实现中,包含了自动回车这一功能,最后导致,\n为换行回车
#include<stdio.h>
void Func1()
{
    printf("hello world\n");
    printf("换行+回车\n");  //hello world
	return;				//换行+回车
}
void Func2()
{
    printf("123456\r");
    printf("654\n");  //测试结果为654456
    return;
}
int main()
{
    printf("测试换行\n");
    Func1();
    printf("测试回车\n");
    Func2();
    return 0;
}

缓冲区

Linux缓冲区是指在内存中开辟的一块区域,用于存储输入输出数据的临时存储区域。当应用程序向文件或设备进行读写操作时,数据会先被存储到缓冲区中,然后再由缓冲区将数据写入磁盘或设备中。缓冲区的作用是提高数据读写的效率,减少磁盘或设备的访问次数,从而提高系统的性能。在Linux系统中,缓冲区的大小可以通过修改内核参数来进行调整。

我们来看看缓冲区的体现

在这里插入图片描述

认识fflush函数

fflush(stdin)是清空输入缓存的函数,在输入字符之前调用它可以清除之前未读取的字符。

fflush(stdout)是刷新输出缓冲区的函数,它可以强制将缓冲区中的输出立即发送到输出设备(通常是显示器)。它对应的头文件是<stdio.h>

#include<stdio.h>
#include<unistd.h>   //sleep的头文件
int main()
{
    printf("hello world!")
    fflush(stdout); //刷新缓冲区
    sleep(2);
    return 0;
}

总结

  1. \n 自带刷新缓冲区的功能
  2. fflush(stdout)可以强制刷新输出缓冲区的函数

小程序的实现

我们学习了上文中的换行和回车,以及缓冲区的概念,以此尝试在Linux中尝试做两个小程序,倒计时和进度条程序的实现。

倒计时程序

结合换行和回车,以及缓冲区的概念,我们可以实现倒计时

# include<stdio.h>
# include<unistd.h>
void Fun1(int n)
{
    //实现倒计时的函数
    int i=n; 
    for(; i >= 0 ; i-- )
    {
        printf("%-5d\r",i);
        fflush(stdout);
        sleep(1);  
    }   
}
int main()
{
    //实现倒计时,我们测试过缓冲区和换行回车
    //倒计时的实现应该是使用 \r 回车符号,不断变更数值
    int n=0;
    printf("请输入N的数值:");
    scanf("%d",&n);// 实现任意倒计时
    //实现函数主体
    Fun1(n);
    return 0;
}

进度条程序

进度条是指通过展示下载的过程(进度)以及百分比还有加载光标,来模拟进度条。

Progressbar.h

进度条头文件,我们在里面声明函数,宏定义变量,导入头文件。

//下面是Progressbar.h文件内容
# pragma once  
#include<stdio.h>
#include<unistd.h>
//进度条的头文件,进行设置宏定义

#define Num 102
#define Top 100

#define Body '='
#define Right '>'

//声明函数
extern void progressbar(int speed);//实现
extern void initbar();  //初始化

Progressbar.c

//实现进度条程序的主要文件
#include<stdio.h>
#include "ProgressBar.h"
#include<string.h>
#include<unistd.h>
//方案二:
const char* lable="\\|/-";
char bar[Num];

#define GREEN "\033[0;32;32m"  //这是改变打印的颜色语句
#define NONE "\033[m"
void progressbar(int rate)  //rate表示的是当前的进下载进度 0-100区间的范围
{
    //rate 表示的是当前下载进度
    if(rate<0||rate>100 ) return ;
    int len=strlen(lable);

    printf(GREEN"[%-100s]"NONE"[%d%%][%c]\r",bar,rate,lable[rate%len]);

    fflush(stdout);  //使用fflush强制刷新输出缓冲区
    bar[rate++]=Body;
    if(rate<100) bar[rate]=Right;   //只要没有超过100 就加上Right

}

void initbar()
{
    memset(bar,'\0',sizeof(bar));
}

//下面是第一种方法,直接调用progressbar(加载速度) 传参为speed 即文件下载速度
//方案一:
//void progressbar(int speed)
//{
//    //实现进度条代码
//    char bar[Num];
//    //初始化bar
//    memset(bar, '\0', sizeof(bar));
//
//    //使用while循环实现
//    int len = strlen(lable);
//    int count = 0;
//    while (count <= 100)
//    {
//        //进行打印
//        printf("[%-100s][%d%%][%c]\r", bar, count, lable[count % len]);
//        fflush(stdout);      //没有\n,就无法刷新,只能手动刷新,使用fflush,显示器默认的是行刷新
//        bar[count++] = Body;
//        if (count < 100) bar[count] = Right;
//        usleep(speed);
//    }
//    printf("\n");
//}

test.c

这是主要文件,从该文件传参实现文件的运行

#include<stdio.h>
#include"ProgressBar.h"

typedef void (*callback_t)(int);// 函数指针类型

void downLoad(callback_t cb)   //使用函数指针来调用
{
    //callbak_t 实际上就是表示一个参数为int的函数指针,那么cb表示这个函数名
    int total =1000;  //下载的总容量
    int curr=0;       //当前下载的容量

    while(curr<=total)
    {
        usleep(50000);  //表示模拟下载花费的时间
        int rate=curr*100/total; //更新进度

        cb(rate);//将rate参数传递给cb函数(形参)
        curr+=10;//表示一次循环下载了一部分
    }
    printf("\n");
}

int main()
{

    printf("下载1:\n");
    downLoad(progressbar);
    initbar();  //进行对于bar初始化
    
    printf("下载2:\n");
    downLoad(progressbar);
    initbar();  //下载一次就要进行初始化
    
    printf("下载3:\n");
    downLoad(progressbar);
    initbar();  

    printf("下载4:\n");
    downLoad(progressbar);
    initbar();
    return 0;
}

//方案一: 手动控制每一次加载usleep的时间
//int main()
//{
//    //实现进度条的主程序
//    printf("第一次加载:\n");
//    
//    progressbar(100000);
//    
//    return 0;    
//}

在这里插入图片描述

总结

  1. \n和\r我们都进行了解释和演示,对于缓冲区的概念图文解释,认识到了两种方式来强制刷新缓冲区。
  2. 标准输入(stdin)标准输出(stdout)标准错误 ,我们认识到了fflush函数来强制刷新
  3. \n 实际上是执行换行+回车操作的,也有刷新缓冲区的作业
  4. 我们实现了两个Linux上的小程序,倒计时以及进度条。

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

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

相关文章

创建git仓库连接上传全过程记录

1.初始化仓库 使用git init命令在一个新文件夹里初始化仓库 2.在github创建仓库 3.连接git仓库 采用命令是 git remote add origin 仓库地址4.添加文件进行测试 5.选择要上传的文件 一般选择git add .命令 6.提交文件到本地仓库 git commit -m "备注信息"7.…

RISCV - 1 RV32/64G指令集清单

RISCV - 1 RV32/64G指令集清单 1 RV32/64G指令类型2 RV32I 基本指令集3 RV64I基础指令集&#xff08;除了RV32I)4 RV32/RV64 Zifencei标准扩展5 RV32/RV64 Zicsr标准扩展6 RV32M标准扩展7 RV64M标准扩展&#xff08;除了RV32M)8 RV32A标准扩展9 RV64A标准扩展&#xff08;除了R…

php实现站群软件权限管理功能示例

1.管理员页面RBAC.php <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>权限管理</title> <script src"bootstrap/js/jquery-1.11.2.min.js"></script> </head>…

jenkins war包 centos启动安装指导

文章目录 步骤1&#xff1a;进入官网&#xff0c;下载到Jenkins的war包1.1 放置在指定位置1.2 放置安装包和创建文件放置路径1.3 检查环境1.4 配置启动命令和结束命令 步骤2&#xff1a; 启动后进入到Jenkins页面2.1 安装插件&#xff0c;例如流水线2.2 依然出现安装插件失败的…

ReWorks系统加载启动

1、通过网络或本地加载启动 配置tftp网络 网卡属性配置为100Mbps全双工 配置串口 目标板上电进入uboot 设置PC机IP、目标机IP、目标机MAC地址 加载文件并启动 固化系统镜像至SD卡 需支持挂载文件系统&#xff0c;并启动ftp服务 选择SD卡、文件系统、ftp服务 挂接SD卡 也可以…

动态规划---最大字段和

描述 给出 n 个整数序列&#xff08;可能为负数&#xff09;组成的序列 a1​, a2​,...,an​&#xff0c;求该序列形如 的子段和的最大值。当所有整数均为负数时&#xff0c;定义最大子段和为 0 。 输入描述 多测试用例。每个测试用例 2 行&#xff1a; 第一行是序列的个数…

Day977.除了授权码许可类型,OAuth 2.0还支持什么授权流程? -OAuth 2.0

除了授权码许可类型&#xff0c;OAuth 2.0还支持什么授权流程&#xff1f; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于除了授权码许可类型&#xff0c;OAuth 2.0还支持什么授权流程&#xff1f;的内容。 授权码许可的流程最完备、最安全没错儿&#xff0c;但它…

将大模型集成到语音识别系统中的例子

概述 本文旨在探索将大型语言模型&#xff08;LLMs&#xff09;集成到自动语音识别&#xff08;ASR&#xff09;系统中以提高转录准确性的潜力。 文章介绍了目前的ASR方法及其存在的问题&#xff0c;并对使用LLMs的上下文学习能力来改进ASR系统的性能进行了合理的动机论证。 本…

【分布式缓存】springboot整合jetcache使用详解

目录 一、前言 二、多级缓存问题 2.1 缓存分类 2.1.1 本地缓存 2.1.2 分布式缓存 2.2 独立缓存的问题 2.2.1 缓存雪崩问题 2.2.2 对宽带压力大 2.2.3 运行效率低 2.3 多级缓存方案 2.3.1 多级缓存实践方案推荐 三、jetcache介绍 3.1 jetcache概述 3.2 jetcache 特…

手写代码系列

(1)手写clearfix .clearfix:after{content:; display:table;clear:both;} (2) 手写圣杯模型 (3)手写深拷贝 递归 const obj3={age:20,name:xxx,address:{} }, arr:[a,b,c] function deeepClone(obj={}){} (4)手写画图解释原型链(class的原型和本质)

vue3 引入dataV 报错,使用patch-package记录插件包 node_modeule 修改记录。 vite 版DataV

开发数字大屏功能&#xff0c;引用dataV UI组件库比较好用&#xff0c;目前分为Vue2 和 Vue3 两个版本。 Vue2 --DataV版本 yarn add jiaminghi/data-viewVue3 --DataV版本 yarn add dataview/datav-vue3vite – --DataV版本 //不想动手改的&#xff0c;也可以使用此版本&a…

2、常用布局控件

首先,展开工具箱。注意这里打开的文件要是窗体文件,就是Form1,cs,否则工具箱列表将是空的。 然后选到容器,这里我们就可以看到常用的布局控件了。 使用的时候直接从左边拉到右边即可 注意:布局是支持嵌套的。 这里我们逐个介绍。 第一个是指针,这个不是布局控件,就是…

LCD-STM32液晶显示中英文-(7.字模及显示原理)

目录 字模介绍 什么是字模 字模的构成 字模显示原理 字模制作 如何制作字模 字模寻址公式 存储字模文件 字模介绍 什么是字模 有了编码&#xff0c;我们就能在计算机中处理、存储字符了&#xff0c;但是如果计算机处理完字符后直接以编码的形式输出&#xff0c;人类将难…

python解析器和pycharm编译器安装

python解析器下载地址&#xff1a;https://www.python.org/getit/ 注意事项&#xff1a; 1. 建议下载3.6以以上的版本&#xff0c; 2. 官网下载比较慢&#xff0c;可以自行寻找其它网站下载&#xff0c; 3. 建议使用.exe安装包方式下载安装 下载完成后双击运行 验证是否安装成功…

使用Python提取TripAdvisor数据:探索旅游的新途径

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 猫途鹰&#xff08;TripAdvisor&#xff09;是一个旅游点评网站&#xff0c;如果您想要爬取该网站的数据&#xff0c;需要了解该网站的访问规则和爬取限制。 环境使用: Python 3.8 Pycharm 代码实现 针对猫途鹰网站&#…

Echarts柱状图横向滚动,如何实现从后往前滚动

Echarts柱状图横向滚动&#xff0c;如何实现从后往前滚动 设置开始和结束的横坐标&#xff0c;设置产生横向滚动条

解决apkanalyzer.bat could NOT be found in D:\Download\Android SDK Tools!警告报错

appium安装过程中很可能出现以下警告报错&#xff0c;咱就按如下操作即可搞定&#xff01;&#xff01;&#xff01; apkanalyzer.bat could NOT be found in D:\Download\Android SDK Tools! 一、下载Command line tools 下载地址&#xff1a;​https://developer.android.g…

GAMES101 作业1

文章目录 作业内容构建视图矩阵&#xff08;View&#xff09;构建模型矩阵 (Model)构建透视矩阵&#xff08;Projection&#xff09;视口变换(Viewport transform)提高&#xff1a;将三角形绕任意过原点的轴旋转旋转过程中报错 作业内容 本次作业的任务是填写一个旋转矩阵和一…

大模型开发(五):实现Jupyter本地调用OpenAI API

全文共3000余字&#xff0c;预计阅读时间约15分钟 | 满满干货&#xff0c;建议收藏&#xff01; 大模型开发(五)&#xff1a;实现Jupyter本地调用OpenAI API OpenAI作为本轮大语言模型技术进步的先驱&#xff0c;其系列大型模型在效果上一直保持着领先。其推出的各类模型如文本…

【PDF】HTML通过dom节点生成pdf

1、简要描述 上一篇博客主要讲的是pdf文件转换成canvas&#xff0c;然后进行相关的画框截图操作。 【PDF】Canvas绘制PDF及截图 本篇博客主要讲html中dom如何生成pdf文件&#xff08;前端生成pdf&#xff09;&#xff0c;后端生成pdf当然也可以&#xff0c;原理也是将html网…