当前位置: 首页 > news >正文

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.cgcc $^ -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;
}

执行结果

相关文章:

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

目录 1.换行、回车概念 2.缓冲区 2.1缓冲区 2.2强制刷新 3.进度条程序 Makefile文件 ProgressBar.h ProgressBar.c Main.c 执行结果 1.换行、回车概念 /n&#xff1a;换行回车&#xff08;\r&#xff1a;回车&#xff09; 2.缓冲区 如下图在vim编辑器中的命令模式下…...

Ubuntu 22.04.5 修改IP

Ubuntu22.04.5使用的是netplan管理网络&#xff0c;因此需要在文件夹/etc/netplan下的01-network-manager-all.yaml中修改&#xff0c;需要权限&#xff0c;使用sudo vim或者其他编辑器&#xff0c;修改后的内容如下&#xff1a; # Let NetworkManager manage all devices on …...

解决virtualbox出现开启DHCP之后ubuntu虚拟机之后IP重复的问题

找遍了国内论坛&#xff0c;没一个能解决该问题的&#xff0c;所以我自己写个文章吧&#xff0c;真讨厌那些只会搬运的&#xff0c;污染国内论坛环境&#xff0c;搜一个问题&#xff0c;千篇一律。 问题 操作系统版本为"Ubuntu 24.04 LTS" lennytest1:~$ cat /etc…...

Java开发工具-Jar命令

Java开发工具-Jar 1、jar命令全平台使用 2、jar命令的作用 为类和资源创建存档&#xff0c;并从存档中操作或恢复单个类或资源 3、摘要 jar [OPTION …] [ [–release VERSION] [-C dir] files] … 4、jar命令描述 jar命令通常作为用于压缩与解压的工具&#xff0c;基于ZIP或Z…...

UE5通过蓝图节点控制材质参数

通过蓝图节点控制材质的参数 蓝图节点 在材质上设置标量值 和 在材质上设置向量参数值 Set Scalar Parameter Value on Materials Set Vector Parameter Value on Materials 这两个蓝图节点都可以在蓝图中&#xff0c;控制材质的参数值和向量值...

敖行客年终总结-AT Work 1.0发布

2024年就要过去了&#xff0c;看看敖行客这一年都干了些啥&#xff1f; 敖行客团队通过整整一年的努力&#xff0c;正式推出了AT Work 1.0订阅版&#xff0c;这也标志着AT Work即将正式和C端的小伙伴见面了。 AT Work 是什么&#xff1f; 长期以来&#xff0c;软件研发成本、…...

线程锁和协程锁的区别

转自&#xff1a;chatgpt 1.bthread_mutex_t bthread_mutex_t 是 brpc 框架提供的一种互斥锁&#xff0c;专门为 bthread&#xff08;轻量级线程&#xff09; 设计&#xff0c;具有以下特点&#xff1a; 适用于 bthread 调度模型&#xff1a; bthread_mutex_t 是为 brpc 中的…...

手机租赁平台开发助力智能设备租赁新模式

内容概要 手机租赁平台开发&#xff0c;简单说就是让你用得起高大上的智能设备&#xff0c;不管是最新款的手机、平板&#xff0c;还是那些炫酷的智能耳机&#xff0c;这个平台应有尽有。想要体验但又不希望花大钱&#xff1f;那你就找对地方了&#xff01;通过灵活的租赁方案…...

掌握大数据处理利器:Flink 知识点全面总结【上】

1.Flink的特点 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行状态计算。 Flink主要特点如下&#xff1a; 高吞吐和低延迟。每秒处理数百万个事件&#xff0c;毫秒级延迟。结果的准确性。Flink提供了事件时间(event--time)和处理时间(proces…...

人工智能知识分享第四天-线性回归

线性回归 线性回归介绍 线性回归概念 线性回归(Linear regression)是利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 注意事项&#xff1a; 1 为什么叫线性模型&#xff1f;因为求解的w&#xff0c;都是w的零次幂&am…...

Appium 2.0:移动自动化测试的革新之旅

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 在移动应用开发的领域中&#xff0c;Appium 作为一款强大的自动化测试工具&#xf…...

牛客网最新1129道 Java 面试题及答案整理

前言 面试&#xff0c;跳槽&#xff0c;每天都在发生&#xff0c;而对程序员来说"金三银四"更是面试和跳槽的高峰期&#xff0c;跳槽&#xff0c;更是很常见的&#xff0c;对于每个人来说&#xff0c;跳槽的意义也各不相同&#xff0c;可能是一个人更向往一个更大的…...

Swift Combine 学习(六):自定义 Publisher 和 Subscriber

Swift Combine 学习&#xff08;一&#xff09;&#xff1a;Combine 初印象Swift Combine 学习&#xff08;二&#xff09;&#xff1a;发布者 PublisherSwift Combine 学习&#xff08;三&#xff09;&#xff1a;Subscription和 SubscriberSwift Combine 学习&#xff08;四&…...

Vue-router知识点汇总

import Vue from vue import Router from vue-router Vue.use(Router) import Layout from /layout export const constantRoutes [{path: /forgetpsd,name: forgetPsd,// 命名路由 &#xff0c;跳转<router-link :to"{ name: forgetPsdr, params: { userId: 123 }}&q…...

java AQS

什么是AQS AQS&#xff08;AbstractQueuedSynchronizer&#xff0c;抽象队列同步器&#xff09;是 Java 中并发控制的一种机制&#xff0c;位于 java.util.concurrent.locks 包下&#xff0c;它为构建锁、信号量等同步工具提供了一个框架。AQS 通过 队列 来管理多个线程之间的…...

L25.【LeetCode笔记】 三步问题的四种解法(含矩阵精彩解法!)

目录 1.题目 2.三种常规解法 方法1:递归做 ​编辑 方法2:改用循环做 初写的代码 提交结果 分析 修改后的代码 提交结果 for循环的其他写法 提交结果 方法3:循环数组 提交结果 3.方法4:矩阵 算法 代码实践 1.先计算矩阵n次方 2.后将矩阵n次方嵌入递推式中 提…...

sdut-C语言实验-合数分解

sdut-C语言实验-合数分解 分数 12 全屏浏览 切换布局 作者 马新娟 单位 山东理工大学 合数是指在大于1的整数中&#xff0c;除了1和本身外&#xff0c;还能被其他数整除的数。‌例如&#xff0c;4、6、8、9、10等都是合数。把一个合数分解成若干个质因数乘积的形式(即求质因…...

深入理解 pytest Fixture 方法及其应用

在 Python 自动化测试领域&#xff0c;pytest 是当之无愧的王者。提到 pytest&#xff0c;不得不说它的一大核心功能——Fixture。Fixture 的强大&#xff0c;让复杂的测试流程变得井井有条&#xff0c;让测试代码更加灵活和可复用。 那么&#xff0c;pytest 的 Fixture 究竟是…...

在Linux上获取MS(如Media Server)中的RTP流并录制为双轨PCM格式的WAV文件

在Linux上获取MS(如Media Server)中的RTP流并录制为双轨PCM格式的WAV文件 一、RTP流与WAV文件格式二、实现步骤三、伪代码示例四、C语言示例代码五、关键点说明六、总结在Linux操作系统上,从媒体服务器(如Media Server,简称MS)获取RTP(Real-time Transport Protocol)流…...

Midjourney技术浅析(八):交互与反馈

Midjourney 的用户交互与反馈通过用户输入&#xff08;User Input&#xff09;和用户反馈&#xff08;User Feedback&#xff09;机制&#xff0c;不断优化和改进图像生成的质量和用户满意度。 一、用户交互与反馈模块概述 用户交互与反馈模块的主要功能包括&#xff1a; 1.…...

综合能源系统多时间尺度优化调度!诸多创新点

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f447; 关注我领取海量matlab电子书和数学建模资料&#x1f34a;个人信条&#xff1a;格物致知,完整Matl…...

python statistics

# Python statistics模块&#xff1a;一个被低估的数据分析工具 很多人第一次接触Python数据分析时&#xff0c;往往会直奔pandas或numpy而去&#xff0c;这当然没错。但有时候&#xff0c;我们需要的只是简单的统计计算&#xff0c;比如算个平均数、中位数&#xff0c;或者看看…...

Docker-存储驱动配置

devicemapper驱动devicemapper 是 Linux 内核中的一个框架&#xff0c;它可以将块设备&#xff08;如磁盘、分区、文件&#xff09;映射成虚拟的块设备。Docker 使用它来为每个容器提供一个独立的、隔离的文件系统。 direct-lvm 和 loop-lvm 是 devicemapper 驱动在 Docker 中实…...

你的Spring Boot项目安全吗?快速排查并修复Fastjson2历史版本(<=2.0.26)的隐藏风险

Spring Boot项目安全自查&#xff1a;Fastjson2历史版本&#xff08;≤2.0.26&#xff09;风险排查与修复指南 最近在帮几个客户做代码审计时&#xff0c;发现不少Spring Boot项目还在使用Fastjson2的老版本。说实话&#xff0c;这个问题比想象中普遍——很多团队甚至不知道自…...

SiameseUIE与LangChain集成:构建智能问答系统

SiameseUIE与LangChain集成&#xff1a;构建智能问答系统 你是不是也遇到过这种情况&#xff1f;面对一份几十页的行业报告、一堆杂乱的技术文档&#xff0c;或者一个复杂的客户案例&#xff0c;想快速找到某个具体问题的答案&#xff0c;却不得不花大量时间从头到尾翻阅。传统…...

数据取证实战:Passware Kit Forensic 和 ElcomSoft 到底怎么选?附真实案例对比

数据取证工具深度评测&#xff1a;Passware Kit Forensic与ElcomSoft实战决策指南 当企业遭遇数据泄露或需要电子取证时&#xff0c;选对工具往往意味着调查成功与否的分水岭。Passware Kit Forensic和ElcomSoft作为行业两大标杆&#xff0c;常让专业人士陷入选择困境——它们都…...

OneRec:生成式推荐模型在短视频场景下的端到端实践与优化

1. 生成式推荐模型为何成为短视频行业新宠 最近两年&#xff0c;生成式推荐模型正在悄悄改变短视频平台的推荐逻辑。传统推荐系统像流水线上的工人&#xff0c;每个环节各司其职&#xff1a;召回负责大海捞针&#xff0c;粗排快速筛选&#xff0c;精排细致打分&#xff0c;最后…...

Lambda 表达式 —— Java 8 的函数式编程利器

同学们好&#xff0c;今天我们学习 Java 中一个非常重要的特性 —— Lambda 表达式。它让 Java 代码变得更简洁、更灵活&#xff0c;是学习 Stream API、函数式编程的基础。一、为什么要引入 Lambda&#xff1f;先看一个例子&#xff1a;我们想创建一个新线程&#xff0c;在控制…...

AMD新平台装CentOS7.9总报Kernel Panic?别折腾了,试试Rocky Linux 9.2吧

AMD新平台安装CentOS7.9遭遇Kernel Panic&#xff1f;Rocky Linux 9.2的完美替代方案 最近几年&#xff0c;AMD的Zen3架构处理器凭借出色的性能和能效比&#xff0c;赢得了大量开发者和技术爱好者的青睐。然而&#xff0c;当这些用户尝试在Ryzen 5000系列平台上安装某些较旧的L…...

从“链表长度”到“游戏对象池”:用C++ std::list的size()函数设计一个简单的内存管理Demo

从链表长度到游戏对象池&#xff1a;用C std::list设计高效内存管理方案 在游戏开发中&#xff0c;频繁创建和销毁对象会导致内存碎片化与性能下降。想象一个2D射击游戏场景&#xff1a;玩家发射的子弹、随机生成的敌人都需要动态管理。传统new/delete直接操作内存的方式在这种…...