Linux 小程序-进度条

news2024/11/23 21:04:15

1.进度条准备知识

        1.1回车与换行

        以前的键盘会有一个这样的按键 ,这个键就是回车与换行。

        回车:从当前行回退到当前行的起始位置。

        换行:从当前行切换到下一行的该位置。

        有了以上的认识我们可以写出一个简单的倒计时代码:

        注意:在linux下 “\r” 是回车然后在打印。

        这样就能在显示行打印出倒计时的感觉了。

1.2缓冲区

        先来看一段代码

                 现象:

                命令行先停止了三秒,然后才会出来 hello word。

                这是为什么呢?是先执行了sleep(3); 这一行代码吗?

                不是的,因为c对io函数提供了一个缓冲区,这段代码执行的结果先被保存在缓冲区中,之后等程序完成后才刷新到屏幕上。

                所以有没有什么方法让显示器即刻刷新?有的!通过使用 fflush(stdout) 命令!

                这样就能即可在命令行刷新出hello word 无需等待!!!

1.3简单进度条

        简单进度条的代码如下:

2.进度条

        1.创建makefile文件

2.进度条代码

        1.在主函数中调用函数。

          2.头文件中定义各种变量

        3.

        进度条运行过程: 

        结束:

3.进度条进阶

        上面写的进度条并没有根据实际的下载进度来显示进度,而是以固定模式来显示进度。

        我们可以根据当前的实际情况来显示进度,比如根据文件的传输速率来显示进度。

代码:

makefile:

  1 processbar:main.o processbar.o                                                                                                               
  2   gcc -o $@ $^
  3 main.o:main.c
  4   gcc -c main.c
  5 processbar.o:processbar.c
  6   gcc -c processbar.c
  7 
  8 .PHONY:clean
  9 clean:
 10   rm main.o processbar.o processbar 
 11 

processbar.h

  1 #pragma once 
  2 #include<stdio.h>
  3 #include<string.h>
  4 #include<unistd.h>
  5 
  6 #define NUM 102
  7 #define Body  '='
  8 #define Head  '>'
  9 
 10 void process();                                                                                                                              
 11 typedef void (*callback_t)(double);
 12 
 13 void process_flush( double rate );

processbar.c

#include"processbar.h"
  2 
  3 const char *lable = "|/-\\|/-\\";
  4 
  5 
  6 //version1
  7 void process()
  8 {
  9   char buffer[NUM];
 10   memset(buffer , '\0',sizeof(buffer));
 11   int cnt = 0;
 12   int n = strlen(lable);
 13   buffer[0] = Head;
 14   while(cnt <= 100)
 15   {
 16   printf("[%-100s][%3d%%][%c]\r",buffer,cnt,lable[cnt%n]);
 17 
 18   fflush(stdout);
 19   buffer[cnt++] = Body;
 20  if(cnt < 100)  buffer[cnt] = Head;
 21   usleep(50000);
 22 
 23   }
 24 
 25 printf("\n");
 26 
 27 }

1 //version : 进度是多少,你的进度条能知道吗另外,什么进度?依附于其他应用,比如下载
 32 //                                                                                                                                           
 33 char buffer[NUM] = {0};
 34 void process_flush(double rate)
 35 {
 36 
 37   static  int cnt = 0;
 38   int n = strlen(lable);
 39   if(rate <= 1.0) buffer[0] = Head;
 40   
 41   printf("[%-100s][%.1f%%][%c]\r",buffer,rate,lable[cnt%n]);
 42 
 43   fflush(stdout);
 44   buffer[(int)rate] = Body;
 45   if((int)rate+1 < 100) buffer[(int)(rate+1)] = Head;
 46   if(rate>= 100.0) printf("\n");
 47 
 48   cnt++;
 49   cnt %= n;
 50 }

main.c:

#include<time.h>
  3 #include<stdlib.h>
  4 #define FILESIZE 1024*1024*1024
  5 
  6 void download(callback_t cd)
  7 {
  8   srand(time(NULL)^1023);
  9   int total = FILESIZE;
 10   while(total)
 11   {
 12     usleep(1000);
 13     int one = rand()%(1024*1024);
 14     total -= one;
 15     if(total < 0) total = 0;
 16 
 17     //当前的进度是多少?
 18     int download = FILESIZE - total;
 19     double rate = (download*1.0 /(FILESIZE))*100.0;
 20     cd(rate);
 21 //    printf("download: %f\n",rate); //rate有啦,应该让进度条刷新
 22 
 23 
 24   }
 25 
 26 
 27 }

    int main()
 34 {
 35 //  process();
 36   download(process_flush);                                                                                                                   
 37   return 0 ;
 38 }

        

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

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

相关文章

如何掌握项目管理的5个阶段?

项目管理协会&#xff08;PMI&#xff09;创建了一个五步项目管理流程&#xff0c;即从启动、规划、执行、监控到结束&#xff0c;为项目经理更好地管理项目提供了现成的基础。如果你正为范围蔓延、返工或项目总体混乱而苦恼&#xff0c;那么遵循项目管理的五个阶段&#xff0c…

【装包拆包----泛型】

文章目录 装箱和拆箱泛型创建一个泛型数组泛型的上界泛型方法 装箱和拆箱 装箱&#xff1a; 把基本数据类型给到引用数据类型 public static void main(String[] args) {//自动装包//第一种装包Integer c 12;//第二种装包int a 7;Integer b a;//显示装包Integer aa Intege…

什么是自动化测试框架?

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“框架”…

应用协议安全:Rsync-common 未授权访问.

应用协议安全&#xff1a;Rsync-common 未授权访问. Rsync 是 Linux 下一款数据备份工具&#xff0c;支持通过 rsync 协议、ssh 协议进行远程文件传输。其中 rsync 协议默认监听 873 端口&#xff0c;如果目标开启了 rsync 服务&#xff0c;并且没有配置 ACL 或访问密码&#…

Node.js 安装配置

文章目录 安装检测Node是否可用 安装 首先我们需要从官网下载Node安装包:Node.Js中文网,下载后双击安装没有什么特殊的地方&#xff0c;安装路径默认是C盘&#xff0c;不想安装C盘的话可以选择一下其他的盘符。安装完成以后可以不用配置环境变量&#xff0c;Node安装已经自动给…

【算法总结】归并排序专题(刷题有感)

思考 一定要注意归并排序的含义&#xff0c;思考归并的意义。 主要分为两个步骤&#xff1a; 拆分 每次对半分(mid l r >> 1)输入&#xff1a;raw整块&#xff0c;输出&#xff1a;raw左块 raw右块 合并 每次都要对raw左块、 raw右块按照某种规则进行合并输入&#xf…

计算机基础知识53

模板之过滤器 # HTML被直接硬编码在 Python代码之中&#xff0c;Django的 模板系统(Template System) # 过滤器给我们提供的有六十多个&#xff0c;但是我们只需要掌握10个以内即可 过滤器名称就是函数名 # 语法&#xff1a;{{ obj|filter__name:param }} 变量名字…

多个Obj模型合并

MergeObj&#xff08;合并Obj模型&#xff09; 1 概述 由于项目原因&#xff0c;需要下载谷歌地图上的模型&#xff0c;关于谷歌模型下载的&#xff0c;见我的CSDN博客. 由于下载谷歌地图上的数据&#xff0c;会分多个模块下载。下载完成后&#xff0c;怎么合并&#xff0c;在…

电脑检测温度软件有哪些?

环境&#xff1a; Win10 专业版 问题描述&#xff1a; 电脑检测温度软件有哪些&#xff1f; 解决方案&#xff1a; 有很多电脑检测温度的软件可供选择&#xff0c;以下是一些常用的电脑温度监测工具&#xff1a; HWMonitor&#xff1a;一款免费的硬件监控软件&#xff0…

快速生成力扣链表题的链表,实现快速调试

关于力扣链表题需要本地调试创建链表的情况 我们在练习链表题&#xff0c;力扣官方需要会员&#xff0c;我们又不想开会员&#xff0c;想在本地调试给你们提供的代码 声明&#xff1a;本人也是参考的别人的代码&#xff0c;给你们提供不同语言生成链表 参考链接&#xff1a; 参…

正则表达式入门教程

一、本文目标 让你明白正则表达式是什么&#xff0c;并对它有一些基本的了解&#xff0c;让你可以在自己的程序或网页里使用它。 二、如何使用本教程 文本格式约定&#xff1a;专业术语 元字符/语法格式 正则表达式 正则表达式中的一部分(用于分析) 对其进行匹配的源字符串 …

01背包 D. Make Them Equal

Problem - D - Codeforces 输出值不超过k次操作后的最大值。 看b数组的大小&#xff0c;b数组元素是小于1000的正整数。从1到bi如果可以&#xff0c;那么最多是大概10次的&#xff0c;因为是指数递增的&#xff0c;例如&#xff1a;1 -> 2 -> 4 -> 8 -> 16 -> …

12-使用vue2实现todolist待办事项

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

【Java】若依的使用代码生成及字典的使用

一、导言 1、介绍 若依管理系统是一款基于Java语言开发的开源管理系统。它采用了Spring Boot框架&#xff0c;使得开发更加快速和高效。同时&#xff0c;它还集成了MyBatis Plus&#xff0c;进一步简化了数据库操作。若依管理系统的界面简洁美观&#xff0c;且支持多语言&#…

M系列 Mac使用Homebrew下载配置git和连接GitHub

一、首先我们需要安装Homebrew M系列 Mac安装配置Homebrewhttps://blog.csdn.net/W_Fe5/article/details/134428377?spm1001.2014.3001.5501 二、下载git 1、终端输入一下命令 brew install git 2、这时下载完成 二、配置git 1、创建用户名和邮箱 这里以我自己的邮箱举例…

Unity中Shader矩阵的行列式

文章目录 前言一、什么是矩阵的行列式&#xff1f;1、只有方阵才有行列式&#xff08;即 n X n 的矩阵&#xff09;2、数学上表示为 det(A) 或者 |A|3、行列式可以看做有向面积 或 体积 在空间中的变化影响 二、2 x 2矩阵的行列式三、3 x 3矩阵的行列式四、行列式计算总结五、使…

【电路笔记】-快速了解无源器件

快速了解无源器件 文章目录 快速了解无源器件1、概述2、电阻器作为无源器件3、电感器作为无源器件4、电容器作为无源器件5、总结 无源器件是电子电路的主要构建模块&#xff0c;没有它们&#xff0c;这些电路要么根本无法工作&#xff0c;要么变得不稳定。 1、概述 那么什么是…

word批量图片导出wps office word 图片批量导出

word批量导出图片教程 背景 今天遇到了一个场景&#xff0c;因为word里的图片打开看太模糊了&#xff0c;如果一个一个导出来太麻烦。想批量将word中的图片全部导出 但是&#xff0c;wps导出的时候需要会员 教程开始&#xff1a; 将word保存为 .docx 格式&#xff0c;可以按F1…

JAVA G1垃圾收集器介绍

为解决CMS算法产生空间碎片和其它一系列的问题缺陷&#xff0c;HotSpot提供了另外一种垃圾回收策略&#xff0c;G1&#xff08;Garbage First&#xff09;算法&#xff0c;通过参数-XX:UseG1GC来启用&#xff0c;该算法在JDK 7u4版本被正式推出&#xff0c;官网对此描述如下&am…

C语言判断闰年(ZZULIOJ1028: I love 闰年!)

题目描述 根据一个年份&#xff0c;判断是否是闰年。 输入&#xff1a;输入为一个整数&#xff0c;表示一个年份。 输出&#xff1a;如果是闰年&#xff0c;输出"Yes"&#xff0c;否则输出"No"。输出单独占一行。 样例输入 Copy 2012 样例输出 Copy Yes 分…