Linux平台下实现的小程序-进度条

目录

1.换行、回车概念

2.缓冲区

2.1缓冲区

2.2强制刷新

3.进度条程序

Makefile文件

ProgressBar.h

ProgressBar.c

Main.c

执行结果


1.换行、回车概念

/n:换行+回车(\r:回车)

2.缓冲区

如下图在vim编辑器中的命令模式下输入命令,在3号手册中查看sleep。

sleep是由Linux提供的接口,用于程序在执行时停下来休眠数秒。

如下图在命令行窗口中输入命令,在3号手册中查看usleep。

usleep是由Linux提供的接口,用于程序在执行时停下来休眠数微秒。

sleep与usleep的区别是sleep休眠时间单位是秒,usleep休眠时间单位是微秒。

1秒=1000毫秒=1000 000微秒=1000纳秒

2.1缓冲区

情况一、加上\n

运行结果:先打印字符串换行休眠三秒再打印命令行提示符

情况二、不加\n

运行结果:休眠三秒然后打印出字符串和命令行提示符

出现以上两种不同的情况是因为printf()函数不是直接向显示器文件写入,而是先向缓冲区中写入。

  1. 由键盘输入字符也是会立即显示到屏幕上的。
  2. 之前printf函数是向磁盘中写入,然后再向显示器中写入,现如今为了提高效率,向内存中写入而不是向磁盘中写入(由内存向内存拷贝数据要比由内存向磁盘拷贝数据要快);
  3. 由缓冲区向显示器中刷新,单次刷新量越大刷新次数越少,效率越高,但一次刷新太多用户看不过来,对于我们人来说习惯于按行读。综合来说按行刷新是最合理的。

2.2强制刷新

C语言中fflush函数用来强制将数据刷新到显示器上。

每一个C语言程序在执行开始之前会默认打开如下3个流:

  1. FILE* stdin:是标准输入流,对应的设备是显示器;
  2. FILE* stdout:是标准输出流,对应的设备是键盘;
  3. FILE* stderr:是标准错误流,对应的设备是显示器。

为什么C语言在开始执行程序之前会打开这3个标准流呢?  

       因为程序对大多数用户来说是用来做计算的,用户由键盘输入,经过程序计算,再由显示器给用户显示出来,显示器和键盘被用户经常使用,那C语言设计者就想既然显示器和键盘被多次用,那在程序开始执行之前默认将其打开。

3.进度条程序

Makefile文件

ProgressBar.exe:Main.c ProgressBar.c
  gcc $^ -o $@ -std=c99
PHONY:clean
clean:
  rm -f ProgressBar.exe 

ProgressBar.h

#pragma once
#include <stdio.h> 

void ProBar1();    
void ProBar2(double fileSize, double current);    

ProgressBar.c

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

//void test()
//{
//  printf("hello\n");
//}
  
#define STYLE '='
#define LENGTH 101

//version 1
void ProBar1()
{
  char bar[LENGTH];
  memset(bar,'\0',LENGTH);
  char state[]={'|','/','-','\\'};
 
  int cnt=0;
  while(cnt<=100)
  {
    printf("[%-100s][%3d%%][%c]\r",bar,cnt,state[cnt%4]);
    fflush(stdout);
    bar[cnt++] = STYLE;
    usleep(50000);
  }
  printf("\n");
} 

//version 2
void ProBar2(double fileSize, double current)
{                                                                                                                                                                                                            
   double rate = (current*100.0) / fileSize; 
   int loopCount = (int)rate;
   char bar[loopCount+1];
   memset(bar,STYLE,loopCount);
   bar[loopCount] = '\0';
  
   char state[]={'|','/','-','\\'};
  
   printf("[%-100s][%.1lf%%][%c]\r",bar,rate,state[loopCount%4]);
   fflush(stdout);
 }

Main.c

#include "ProgressBar.h"
#include <unistd.h>
double bandwith = 1.2*1000000;

void download(double fileSize)
{
  double current = 0.0;
  printf("download begin\n");
  while(current<=fileSize)
  {
      ProBar2(fileSize,current);
  
      double old = current;
      current += bandwith;
      if(old<fileSize && current>fileSize)
      {
        current = fileSize;
      }
      sleep(1);
  }
  printf("\n");
  printf("download end fileSize:%lf\n",fileSize);
}
  
int main()
{
//  test();
  
//  ProBar();
//  ProBar2(100,56.6);
//  printf("\n");
//  ProBar2(67,66);
//  printf("\n");                                                                                                                                                                                            
//  ProBar2(100,1.2);
//  printf("\n");
    double file = 100.2*1024*1024;
    download(file);

    return 0;
}

执行结果

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

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

相关文章

【顶刊TPAMI 2025】多头编码(MHE)之Part 6:极限分类无需预处理

目录 1 标签分解方法的消融研究2 标签分解对泛化的影响3 讨论4 结论 论文&#xff1a;Multi-Head Encoding for Extreme Label Classification 作者&#xff1a;Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位&#xff1a;山东大学 代码&#xff1a;https:…

【Leetcode】732. 我的日程安排表 III

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 当 k k k 个日程存在一些非空交集时&#xff08;即, k k k 个日程包含了一些相同时间&#xff09;&#xff0c;就会产生 k k k 次预订。 给你一些日程安排 [startTime, endTime…

Tableau数据可视化与仪表盘搭建-数据连接

连接数据有三种类型 第一种&#xff0c;连接到本地文件&#xff0c;例如Excel&#xff0c;csv&#xff0c;JSON等 第二种&#xff0c;连接到数据库&#xff0c;例如MySQL 注意&#xff1a;连接到数据库要安装对应的数据库的驱动的 连接本地文件

Chapter4.2:Normalizing activations with layer normalization

文章目录 4 Implementing a GPT model from Scratch To Generate Text4.2 Normalizing activations with layer normalization 4 Implementing a GPT model from Scratch To Generate Text 4.2 Normalizing activations with layer normalization 通过层归一化&#xff08;La…

搭建开源版Ceph分布式存储

系统&#xff1a;Rocky8.6 三台2H4G 三块10G的硬盘的虚拟机 node1 192.168.2.101 node2 192.168.2.102 node3 192.168.2.103 三台虚拟机环境准备 1、配置主机名和IP的映射关系 2、关闭selinux和firewalld防火墙 3、配置时间同步且所有节点chronyd服务开机自启 1、配置主机名和…

GPIO、RCC库函数

void GPIO_DeInit(GPIO_TypeDef* GPIOx); void GPIO_AFIODeInit(void); void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct); void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct); //输出 读 uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx,…

使用JMeter玩转tidb压测

作者&#xff1a; du拉松 原文来源&#xff1a; https://tidb.net/blog/3f1ada39 一、前言 tidb是mysql协议的&#xff0c;所以在使用过程中使用tidb的相关工具连接即可。因为jmeter是java开发的相关工具&#xff0c;直接使用mysql的jdbc驱动包即可。 二、linux下安装jmet…

Launcher3主页面加载显示流程分析

布局结构 抓取布局后&#xff0c;可以看到每个图标是一个DoubleShadowBubbleTextView&#xff0c;父布局是CellLayout、workspace。 我们可以在CellLayout添加子view打印出调用堆栈信息&#xff0c;可以整体上看页面加载显示流程。 主要类 Launcher.java&#xff1a;主界面&…

开发培训:慧集通(DataLinkX)iPaaS集成平台-基于接口的连接器开发(不需要认证机制)

一、开发一个简单的应用0源&#xff0c;本实例中对接的应用不需要接口认证 1、【连接管理-自建】新建应用源&#xff0c;保存并发布 代码示例 return {$$ - >//日志打印$$.$Log.info(日志打印) } 二、使用应用&#xff0c;建立应用连接 1、实例创建&#xff0c;【连接管理…

pikachu靶场--目录遍历和敏感信息泄露

pikachu靶场—目录遍历和敏感信息泄露 目录遍历 概述 在web功能设计中,很多时候我们会要将需要访问的文件定义成变量&#xff0c;从而让前端的功能便的更加灵活。 当用户发起一个前端的请求时&#xff0c;便会将请求的这个文件的值(比如文件名称)传递到后台&#xff0c;后台再…

机器学习详解(13):CNN图像数据增强(解决过拟合问题)

在之前的文章卷积神经网络CNN之手语识别代码详解中&#xff0c;我们发现最后的训练和验证损失的曲线的波动非常大&#xff0c;而且验证集的准确率仍然落后于训练集的准确率&#xff0c;这表明模型出现了过拟合现象&#xff1a;在验证数据集测试时&#xff0c;模型对未见过的数据…

Word2Vec解读

Word2Vec: 一种词向量的训练方法 简单地讲&#xff0c;Word2Vec是建模了一个单词预测的任务&#xff0c;通过这个任务来学习词向量。假设有这样一句话Pineapples are spiked and yellow&#xff0c;现在假设spiked这个单词被删掉了&#xff0c;现在要预测这个位置原本的单词是…

#渗透测试#漏洞挖掘#WAF分类及绕过思路

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

电子应用设计方案85:智能 AI门前柜系统设计

智能 AI 门前柜系统设计 一、引言 智能 AI 门前柜系统旨在提供便捷、安全和智能的物品存储与管理解决方案&#xff0c;适用于家庭、公寓或办公场所的入口区域。 二、系统概述 1. 系统目标 - 实现无接触式物品存取&#xff0c;减少交叉感染风险。 - 具备智能识别和分类功能&am…

如何在不丢失数据的情况下从 IOS 14 回滚到 IOS 13

您是否后悔在 iPhone、iPad 或 iPod touch 上安装 iOS 14&#xff1f;如果你这样做&#xff0c;你并不孤单。许多升级到 iOS 14 beta 的 iPhone、iPad 和 iPod touch 用户不再适应它。 如果您在正式发布日期之前升级到 iOS 14 以享受其功能&#xff0c;但您不再适应 iOS 14&am…

线性代数考研笔记

行列式 背景 分子行列式&#xff1a;求哪个未知数&#xff0c;就把b1&#xff0c;b2放在对应的位置 分母行列式&#xff1a;系数对应写即可 全排列与逆序数 1 3 2&#xff1a;逆序数为1 奇排列 1 2 3&#xff1a;逆序数为0 偶排列 将 1 3 2 只需将3 2交换1次就可以还原原…

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中&#xff0c;画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流&#xff08;程&#xff09;图 Data Flow Diagram&#xff0c;DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具&#xff0c;可以将…

SpringBoot框架开发中常用的注解

文章目录 接收HTTP请求。RestController全局异常处理器Component依赖注入LombokDataBuildersneakyThrowsRequiredArgsConstructor 读取yml文件配置类注解 接收HTTP请求。 RequestMapping 接收HTTP请求。具体一点是 GetMapping PostMapping PutMapping DeleteMapping 一共…

ELK日志平台搭建 (最新版)

一、安装 JDK 1. 下载 JDK 21 RPM 包 wget https://download.oracle.com/java/21/latest/jdk-21_linux-x64_bin.rpm2. 安装 JDK 21,使用 rpm 命令安装下载的 RPM 包&#xff1a; sudo rpm -ivh jdk-21_linux-x64_bin.rpm3. 配置环境变量 编辑 /etc/profile 文件以配置 JAVA_HO…

使用 Jupyter Notebook:安装与应用指南

文章目录 安装 Jupyter Notebook1. 准备环境2. 安装 Jupyter Notebook3. 启动 Jupyter Notebook4. 选择安装方式&#xff08;可选&#xff09; 二、Jupyter Notebook 的基本功能1. 单元格的类型与运行2. 可视化支持3. 内置魔法命令 三、Jupyter Notebook 的实际应用场景1. 数据…