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

进度条—实例示范

在学习了基本的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;
}                                                                

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

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

相关文章

2024年【G1工业锅炉司炉】考试及G1工业锅炉司炉考试内容

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年G1工业锅炉司炉考试为正在备考G1工业锅炉司炉操作证的学员准备的理论考试专题&#xff0c;每个月更新的G1工业锅炉司炉考试内容祝您顺利通过G1工业锅炉司炉考试。 1、【多选题】TSGG0001-2012《锅炉安全技术监察…

高中学校档案室主要做什么

高中学校档案室主要负责管理、保存和维护学校的各类档案文件。具体工作内容包括&#xff1a; 1. 档案收集&#xff1a;负责收集学校各个部门的档案文件&#xff0c;包括学生档案、教职工档案、教学档案、行政档案等。 2. 档案分类和整理&#xff1a;对收集到的档案文件进行分类…

Nginx限流设置

1.反向代理(建议先看正向代理,反向代理则是同样你要与对方服务器建立连接,但是,代理服务器和目标服务器在一个LAN下,所以我们需要与代理服务器先建交,再由他获取与目标服务器的交互,好比一个带刀侍卫守护着目标服务器) 屏蔽目标服务器的真实地址&#xff0c;相对安全性较好&am…

相机图像质量研究(6)常见问题总结:光学结构对成像的影响--对焦距离

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

鸿蒙OS导入项目报错不能运行 @ohos\hvigor\bin\hvigor.js‘

在自学HarmonyOS时&#xff0c;想在DevEco Studio导入官方示例代码&#xff1a;待办列表&#xff08;ArkTS&#xff09;报错 C:\Users\woods\Downloads\test01\ToDoListArkTS\node_modules\ohos\hvigor\bin\hvigor.js --mode module -p moduleentrydefault -p productdefault …

SpringBoot集成Swagger2的增强版Knife4j

1. 背景 作为SpringBoot集成中间件其中的一篇文章吧&#xff0c;既然打算出这么一个系列了&#xff0c;争取做到虽小却全&#xff0c;又精又美的一个系列吧。 Swagger应该都有接触吧&#xff0c;knife4j是Swagger2的增强版&#xff0c;更加友好的操作页面&#xff0c;更多强大…

Java实现民宿预定管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

力扣优选算法100道——【模板】前缀和(一维)

【模板】前缀和_牛客题霸_牛客网 (nowcoder.com) 目录 &#x1f6a9;了解题意 &#x1f6a9;算法原理 &#x1f388;设定下标为1开始 &#x1f388;取值的范围 &#x1f6a9;实现代码 &#x1f6a9;了解题意 第一行的3和2&#xff0c;3代表行数&#xff0c;2代表q次查询(…

【Python4Delphi】学习笔记(一):介绍篇

一、前言&#xff1a; 1. python语言简介&#xff1a; 众所周知&#xff0c;python是目前非常流行的编程语言之一&#xff0c;自20世纪90年代初Python语言诞生至今&#xff0c;它已被逐渐广泛应用于系统管理任务的处理和Web编程。 由于Python语言的简洁性、易读性以及可扩展性…

[React] ref属性

简介 ref 即 reference &#xff0c;是 React 提供给我们的安全访问 DOM 元素或者某个组件实例的句柄。 组件被调用时会新建一个该组件的实例&#xff0c;而 ref 就会指向这个实例。它可以是一个回调函数&#xff0c;这个回调函数会在组件被挂载后立即执行。 为了防止内存泄漏…

C语言笔试题之实现C库函数 pow()(递归的思想)

实例要求&#xff1a; 1、请你实现C库函数 pow()&#xff08;stdio.h & math.h&#xff09; &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即x^n &#xff09;&#xff1b;2、函数声明&#xff1a;double myPow(double x, int n)&#xff1b;参数&#xff1a;1、x …

2019年江苏省职教高考计算机技能考试——一道程序改错题的分析

题目&#xff1a;函数将str字符串中的5个数字字符串转换为整数&#xff0c;并保存在二维数组m的最后一行&#xff0c;各元素为3、-4、16、18、6。并经函数move处理后&#xff0c;运行结果如下&#xff1a; 18 6 3 -4 16 16 18 6 3 -4 -4 16 …

Springboot整合JUnit5框架

目录 第一章、在pom文件中导入依赖第二章、新建测试类第三章、新建测试方法 友情提醒: 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、在pom文件中导入依赖 SpringBoot2.2x之后的版本中spring-boot-starter-te…

如何使用phpStudy搭建网站并结合内网穿透远程访问本地站点

文章目录 [toc]使用工具1. 本地搭建web网站1.1 下载phpstudy后解压并安装1.2 打开默认站点&#xff0c;测试1.3 下载静态演示站点1.4 打开站点根目录1.5 复制演示站点到站网根目录1.6 在浏览器中&#xff0c;查看演示效果。 2. 将本地web网站发布到公网2.1 安装cpolar内网穿透2…

2023年全球软件开发大会(QCon上海站2023):核心内容与学习收获(附大会核心PPT下载)

在信息化和全球化日益加速的今天&#xff0c;软件开发技术日新月异&#xff0c;对全球各行各业产生了深远影响。2023年全球软件开发大会&#xff08;QCon上海站2023&#xff09;无疑成为行业内外瞩目的焦点。本次大会汇集了全球顶级的软件开发专家、企业领袖、研究者&#xff0…

1978-2022年各省家庭恩格尔系数(分城镇、农村)

1978-2022年各省家庭恩格尔系数&#xff08;分城镇、农村&#xff09; 1、时间&#xff1a;1978-2022年 2、指标&#xff1a;城镇家庭恩格尔系数、农村家庭恩格尔系数 3、来源&#xff1a;统计年鉴、省统计公报 4、范围&#xff1a;31省 5、指标解释&#xff1a;恩格尔系数…

sqli-labs-master靶场训练笔记(38-53|boss战)

2024.2.4 level-38 &#xff08;堆叠注入&#xff09; 这题乍一看感觉又是来卖萌的&#xff0c;这不是和level-1一模一样吗 然后仔细看了一下源代码&#xff0c;根据 mysqli_multi_query 猜测这题的本意应该是堆叠注入 mysqli_multi_query() 是 PHP 中用于执行多个 SQL 查…

Docker-Learn(一)使用Dockerfile创建Docker镜像

1.创建并运行容器 编写Dockerfile&#xff0c;文件名字就是为Dockerfile 在自己的工作工作空间当中新建文件&#xff0c;名字为Docerfile vim Dockerfile写入以下内容&#xff1a; # 使用一个基础镜像 FROM ubuntu:latest # 设置工作目录 WORKDIR /app # 复制当前目…

堆排序-Python实现

简述 堆排序&#xff08;Heap Sort&#xff09;是一种基于比较的排序算法&#xff0c;它利用堆这种数据结构所设计的一种排序算法。堆排序是一种选择排序&#xff0c;它的最坏&#xff0c;最好&#xff0c;平均时间复杂度均为O(nlogn)&#xff0c;它也是不稳定排序。 堆 堆排…

力扣精选算法100道——和为 K 的子数组[前缀和专题]

和为K的子数组链接 目录 第一步&#xff1a;了解题意​编辑 第二步&#xff1a;算法原理 第三步&#xff1a;代码 第一步&#xff1a;了解题意 数组中和为k的连续子数组&#xff0c;我们主要关注的是连续的&#xff0c; 比如[1,1,1],和为2的子数组有俩个&#xff0c;比如第…