Linux | 进度条 | Linux简单小程序 | 超级简单 | 这一篇就够了

news2024/11/15 19:37:53

进度条—实例示范

在学习了基本的Linux指令,Linux上vim编译器等等之后,我们就来学习写代码喽~

今天就给大家详细讲解一下进度条的编写,需要的效果如下图:

进度条—必备知识

回车和换行

在我们学习编程语言中,经常使用的 [ \n ] ,是什么意思呢?

  • C 语言中有很多字符,而字符大体分为两类:可显字符、控制字符。
  • 控制字符不可显示,例如 \r 和 \n 就是控制字符。

而在我们平时打字时,一行写满了需要换行,其实只根据字面思想来看,换行就是单纯地换行,也就是使光标跳到下一行就是换行。但是这也仅仅只是换行,如下图光标是在行尾的下面,也就是第一行的行尾,所以这是符合我们习惯的。

我们通常的习惯是,在第二段的最左端开始新一行的内容,而要是光标从上一行的行尾,跳到下一行的最左端就应该是两个动作的:换行和回车。

回车就是回到本行的文本行的开头。

所以在编程语言中, [ \n ] 其实两个动作:

  • [ \n ] :换行 + 回车

那么什么是回车呢?

  • [ \r ] :换行 

缓冲区

必备知识点

sleep
  • sleep:Linux 下的休眠函数,单位是秒。头文件为 #include <unistd.h>。

sleep的效果样式,如下图,系统就会休眠3秒。

如下例子,当我们将 [ \n ] 删掉,运行程序我们发现下面会出现:

光标一直闪烁,但是一直都不打印,这似乎是在等待sleep3秒结束之后,因为没有 [ \n ] ,所以也一直等到程序结束时,与shell命令行提示一起打印出来,shell提示符紧跟字符串后面显示。

这反而像是sleep函数先起作用,然后printf函数再从光标处开始打印。

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

加上 [ \n ] 与 不加 [ \n ] 的区别似乎就是:

  • 加上 [ \n ]:printf执行结束,字符串直接显示出来,然后sleep;
  • 不加 [ \n ]:字符串没有打印出来,先sleep之后,字符串才打印出来。

那么在第二种代码情况下,printf与sleep函数哪个先运行呢?

  • 当然是printf先显示出来;
  • 因为这串字符串并没有换行符,所以打印的字符串必须与命令行的下一行为同一行;
  • C语言执行代码时,永远都是从上往下执行的;
  • 在sleep期间,printf的字符串已经打印出来了,只是这串字符串没有显示出来罢了;
  • 在sleep之后,消息才显示出来。

那么既然printf的字符串已经打印出来了,只是没有显示出来,在sleep期间,字符串是在哪里的呢?

  • 缓冲区

缓冲区理解

缓冲区,可以理解为一块内存空间。

当进行printf打印字符串的时候,字符串被拷贝到了缓冲区,sleep之后,字符串被从缓冲区刷新到显示器,这样就在屏幕上打印出来了字符串了。

一般在程序结束时候或者等到缓冲区满的时候,自动冲刷缓冲区。

缓冲区默认是行刷新的,遇到 [ \n ] 就刷新。

刷缓冲区方式

那么如果不想等到程序结束的时候,直接冲刷缓冲区,如何做呢?

  • [ \n ];
  • 缓冲区已满;
  • 强制刷新。

在打印字符串的后面加上一行强制冲刷缓冲区的代码:

  • fflush(stdout) :刷新缓冲区。
fflush(stdout);                                                                                   
#include <stdio.h>
#include <unistd.h>
int main()
{
    //printf("hello world,hello world...\n");     
    printf("hello world,hello world...");
    fflush(stdout);//强制冲刷缓冲区                                                                              
    sleep(3);
 
    return 0;
}

实现倒计时 

光标和显示器匹配,光标在哪里,显示器打印的时候就从哪里开始打印 。

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

int main()
{
    int cnt=10;
    while(cnt>=0)
    {
        printf("倒计时:%2d\r",cnt);
        sleep(1);
        fflush(stdout);
        cnt--;

    }
    printf("\n");                    
    return 0;
}

 

进度条代码

“ProgressBar.h”头文件

#include "ProgressBar.h"
#include <unistd.h>
//download
double bandwidth=1024*1024*1.0;
void download(double filesize,callback_t cd)
{
    double current=0.0;
    double bandwidth=1024*1024*1.0;

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

int main()
{
    //ForTest();
    //ProgBar(100.0,10.34);
    //ProgBar(100.0,20.34);
    //ProgBar(100.0,99.98);
    //ProgBar(100.0,56.74);
    //ProgBar(100.0,69.98);
    download(100*1024*1024,ProgBar);
    download(50*1024*1024,ProgBar);
    download(800*1024*1024,ProgBar);
    download(890*1024*1024,ProgBar);
    download(67*1024*1024,ProgBar);
    download(10*1024*1024,ProgBar);
    return 0;
}                                                                

“ProgressBar.c”函数文件

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

//version 1
//#define Length 101
//#define Style '#'
//const char* lable="|/-\\";
//void ProgBar()
//{
//   char bar[Length];
//   memset(bar,'\0',sizeof(bar));
//   int len =strlen(lable);

//   int cnt=0;
//   while(cnt<=100)
//  {
//       printf("[%-100s][%3d%%][%c]\r",bar,cnt,lable[cnt%len]);
//       fflush(stdout);
//       bar[cnt++]=Style;
//       usleep(100000);
//  }
//   printf("\n");
//}

#define Length 101
#define Style '#'
const char* lable="|/-\\";
//version 2
void ProgBar(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;
    }
        printf("[%-100s][%.1lf%%][%c]\r",bar,rate,lable[cnt%len]);
        fflush(stdout);
}

“Test.c”测试文件

#include "ProgressBar.h"
#include <unistd.h>
//download
double bandwidth=1024*1024*1.0;
void download(double filesize,callback_t cd)
{
    double current=0.0;
    double bandwidth=1024*1024*1.0;

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

int main()
{
    //ForTest();
    //ProgBar(100.0,10.34);
    //ProgBar(100.0,20.34);
    //ProgBar(100.0,99.98);
    //ProgBar(100.0,56.74);
    //ProgBar(100.0,69.98);
    download(100*1024*1024,ProgBar);
    download(50*1024*1024,ProgBar);
    download(800*1024*1024,ProgBar);
    download(890*1024*1024,ProgBar);
    download(67*1024*1024,ProgBar);
    download(10*1024*1024,ProgBar);
    return 0;
}                                                                

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

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

相关文章

【力扣 - 回文链表】

题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 提示&#xff1a; 链表中节点数目在范围[1, 100000] 内 0 < Node.val < 9 方法一&#xff1a;将值复制到数…

jsp教材管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教材管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

网工内推 | 高级网工,IE认证优先,最高15K,五险一金

01 丰沃创新(北京)科技有限公司 招聘岗位&#xff1a;高级网络工程师 职责描述&#xff1a; 1. 主要负责移动营运商数据中心机房网络的维护工作&#xff1b; 2. 负责防火墙策略调整&#xff0c;负责交换机路由器等网络设备的配置&#xff1b; 3. 负责云专线的入网配置&#…

07:Kubectl 命令详解|K8S资源对象管理|K8S集群管理(重难点)

Kubectl 命令详解&#xff5c;K8S资源对象管理&#xff5c;K8S集群管理 kubectl管理命令kubectl get 查询资源常用的排错命令kubectl run 创建容器 POD原理pod的生命周期 k8s资源对象管理资源文件使用资源文件管理对象Pod资源文件deploy资源文件 集群调度的规则扩容与缩减集群更…

解析spritf和sscanf与模拟常用字符串函数strchr,strtok(二)

今天又来继续我们的字符串函数的文章&#xff0c;这也是最后一篇了。希望这两篇文章能让各位理解透字符串函数。 目录 strchr strtok sprintf和sscanf strchr strchr 是一个用于在字符串中查找特定字符首次出现位置的函数。以下是解析和模拟实现 strchr 函数的示例&…

缓存和分布式锁 笔记

概念 缓存的作用是减低对数据源的访问频率。从而提高我们系统的性能。缓存的流程图 缓存分类 本地缓存 把缓存数据存储在内存中(Map <String,Object>)&#xff0c;其实就是强引用&#xff0c;不会轻易被删除。 分布式缓存 数据冗余&#xff0c;效率不高 整合Redis &l…

计算机设计大赛 深度学习 YOLO 实现车牌识别算法

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 该项目较…

新型RedAlert勒索病毒针对VMWare ESXi服务器

前言 RedAlert勒索病毒又称为N13V勒索病毒&#xff0c;是一款2022年新型的勒索病毒&#xff0c;最早于2022年7月被首次曝光&#xff0c;主要针对Windows和Linux VMWare ESXi服务器进行加密攻击&#xff0c;到目前为止该勒索病毒黑客组织在其暗网网站上公布了一名受害者&#x…

【芯片设计- RTL 数字逻辑设计入门 11.2 -- 状态机实现 移位运算与乘法 2】

文章目录 移位运算与乘法parameterparameter 特点parameter 基本语法parameter 示例局部参数局部参数示例 状态机代码实现VCS 仿真结果 文章 【芯片设计- RTL 数字逻辑设计入门 11.1 – 状态机实现 移位运算与乘法 1】 介绍了状态机&#xff0c;本篇文章主要就是使用状态机的方…

Vision Pro 5 月将在中国区发售;全球科技大厂 1 月已裁员 32000 人丨RTE 开发者日报 Vol.145

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

Stable Diffusion 模型下载:Disney Pixar Cartoon Type A(迪士尼皮克斯动画片A类)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 目前还没有一个好的皮克斯迪士尼风格的卡通模型&#xff0c;所以我决定自己制作一个。这是将皮克斯风格模型与我自己的Loras合并在一起&#xff0c;创建一个通用的…

【Transformer(04/10) 】 Hugging Face手册-推理管道

一、说明 这里是Hugging Face手册第四部分&#xff0c;如何使用推理管道&#xff1b;即使您没有特定模式的经验或不熟悉模型背后的底层代码&#xff0c;您仍然可以使用它们通过 pipeline ()进行推理&#xff01; 二、推理管道 pipeline ()可以轻松使用Hub中的任何模型来推理任…

第三百一十三回

文章目录 1. 概念介绍2. 实现方法2.1 obscureText属性2.2 decoration属性 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何实现倒计时功能"相关的内容&#xff0c;本章回中将介绍如何实现密码输入框.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍…

实例分割论文阅读之:《Mask Transfiner for High-Quality Instance Segmentation》

1.摘要 两阶段和基于查询的实例分割方法取得了显著的效果。然而&#xff0c;它们的分段掩模仍然非常粗糙。在本文中&#xff0c;我们提出了一种高质量和高效的实例分割Mask Transfiner。我们的Mask Transfiner不是在规则的密集张量上操作&#xff0c;而是将图像区域分解并表示…

【Django】ORM关系映射

关系映射 在关系型数据库中&#xff0c;通常不会把所有数据都放在同一张表中&#xff0c;不易于扩展&#xff0c;常见的关系映射有&#xff1a; 一对一映射&#xff0c;如一个身份证对应一个人。 一对多映射&#xff0c;如一个班级可以有多个学生。 多对多映射&#xff0c;如…

基于SpringBoot和PostGIS的震中影响范围可视化实践

目录 前言 一、基础数据 1、地震基础信息 2、全国行政村 二、Java后台服务设计 1、实体类设计 2、Mapper类设计 3、控制器设计 三、前端展示 1、初始化图例 2、震中位置及影响范围标记 3、行政村点查询及标记 总结 前言 地震等自然灾害目前还是依然不能进行准确的预…

解密 ARMS 持续剖析:如何用一个全新视角洞察应用的性能瓶颈?

作者&#xff1a;饶子昊、杨龙 应用复杂度提升&#xff0c;根因定位困难重重 随着软件技术发展迭代&#xff0c;很多企业软件系统也逐步从单体应用向云原生微服务架构演进&#xff0c;一方面让应用实现高并发、易扩展、开发敏捷度高等效果&#xff0c;但另外一方面也让软件应…

每日一练:LeeCode-112、路径总和【二叉树+DFS+回溯】

本文是力扣LeeCode-112、路径总和 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有…

【闲来看源码】分析一下`ArrayUtils.contains()`这个方法的实现

【闲来看源码】分析一下ArrayUtils.contains()这个方法的实现 大家先来看源码 PreAuthorize("ss.hasPermi(system:user:remove)")Log(title "用户管理", businessType BusinessType.DELETE)DeleteMapping("/{userIds}")public AjaxResult remo…