Linux探秘坊-------4.进度条小程序
1.缓冲区
#include <stdio.h>
int main()
{printf("hello bite!");sleep(2);return 0;
}
执行此代码后,会 先停顿两秒,再打印出hello bite,但是明明打印在sleep前面,为什么会后打印呢?
因为:
- 在printf执行完了后,打印的内容被存到了缓冲区
- 程序快结束时缓存区的内容再打印到显示器
奇妙的事情发生了:
#include <stdio.h>
int main()
{printf("hello bite!\n");sleep(3);return 0;
}
如果我们使用这样的代码,会 先打印出hello bite,再停顿两秒,为啥捏?
可以发现和上面的代码对比多了一个/n
- 显示器有一种刷新策略,叫
行刷新 - 而
/n正好代表着换行,所以加了/n的内容会直接从缓存区打印到显示器上,不用等程序结束
那么我们有没有办法 不用\n也能先打印呢?
包有的:
#include <stdio.h>
int main()
{printf("hello bite!");fflush(stdout);sleep(3);return 0;
}
- 这里的fflush(stdout)就起到了
刷新的作用
2.进度条(V1)
1.process.h

2.main.c

3.process.c(重点)

#include"process.h"2 #include<string.h>3 #include<unistd.h>4 5 #define size 101//需要考虑\0所以不是1006 #define style '#'7 8 void process()9 {10 int rate =0;11 char num[size];12 memset(num,0,sizeof(num));//这里是让num全部置空
W> 13 char* lable="|/-\\";//这里是模拟进度条后的圈圈14 int length=strlen(lable);15 while(rate<=100)16 {17 printf("[%-100s][%d%%][%c]\r",num,rate,lable[rate%length]);//100s是指预留100个字符,主要是为让】不动,但这样会导致倒着打印,所以需要加-, \r是指每次打印完了之后都恢复到原位置18 fflush(stdout);//这里因为没有\n所以需要fflush进行刷新19 num[rate]=style;20 ++rate;21 usleep(50000);//usleep和sleep不同,前者单位是微秒 50000微秒=0.5秒22 }23 24 printf("\n");25 }
3.进度条(V2)
1.process.h

2.process.c(重点)

void flushprocess(const char*tips, double total,double current)29 {30 const char *lable="|/-\\";31 int len =strlen(lable);32 static int index=0;33 char num[size];34 memset(num,0,sizeof(num));//将num置空35 36 double rate=current*100.0/total;//计算下载进度37 int n=(int)rate;//用下载进度确定有多少个# 38 39 int i=0;40 for(;i<n;i++)41 num[i]=style;//填充#到num中42 43 printf("%s...[%-100s][%.1lf%%][%c]\r",tips,num,rate,lable[index++]);//进度保留一位小数44 fflush(stdout);//因为没有使用\n,却又想直接刷新,所以需要fflush,记得包头文件#include<unistd.h>45 index %=len;46 if(n>=100)printf("\n");47 }
3.main.c(重点)

#include"process.h"3 #include<unistd.h>4 #include<time.h>5 #include<stdlib.h>6 7 typedef void (*call)(const char*, double,double);//定义函数指针类型8 9 10 11 double speed[]={5.0,0.5,0.3,0.02,0.1,0.01};//模拟网速的波动 12 13 void download(int total,call cb) 14 { 15 srand(time(NULL));//设置种子 16 double current =0.0; 17 while(current<=total) 18 { 19 cb("下载中 ",total,current); 20 if(current>=total)break; 21 int random=rand()%6;//随机匹配网速 22 usleep(5000); 23 current+=speed[random];//加上每次下载的进度 24 if(current>=total)current=total;//有可能总和超过total,这样就没法显示100%,所以需要改为total25 } 26 } 27 28 29 30 31 int main() 32 { 33 download(1024.0,flushprocess);//传递文件大小和函数地址 34 printf("下载 1024.0MB 完成\n"); 35 download(512.0,flushprocess); 36 printf("下载 512.0MB 完成\n"); 37 download(256.0,flushprocess); 38 printf("下载 256.0MB 完成\n"); 39 download(128.0,flushprocess); 40 printf("下载 128.0MB 完成\n"); 41 42 return 0; 43 }
效果如下:

相关文章:
Linux探秘坊-------4.进度条小程序
1.缓冲区 #include <stdio.h> int main() {printf("hello bite!");sleep(2);return 0; }执行此代码后,会 先停顿两秒,再打印出hello bite,但是明明打印在sleep前面,为什么会后打印呢? 因为ÿ…...
Llama 3:开源大模型的里程碑式突破
标题:Llama 3:开源大模型的里程碑式突破 文章信息摘要: Meta通过Llama 3展现了开源LLM的重大突破:采用超大规模训练数据和多阶段训练方法(SFT、rejection sampling、PPO和DPO),突破了传统的Chi…...
计算机网络 (56)交互式音频/视频
一、定义与特点 定义:交互式音频/视频是指用户使用互联网和其他人进行实时交互式通信的技术,包括语音、视频图像等多媒体实时通信。 特点: 实时性:音频和视频数据是实时传输和播放的,用户之间可以进行即时的交流。交互…...
STM32 GPIO工作模式
GPIO工作模式 1. GPIO简介2. GPIO工作模式2.1 输入浮空2.2 输入上拉2.3 输入下拉2.4 模拟2.5 开漏输出2.6 推挽输出2.7 开漏式复用功能2.8 推挽式复用功能 1. GPIO简介 GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚,STM32 芯片的 GPI…...
自动化实现的思路变化
阶段一: 1、成功调用。第一步,一般是用现用的工具,或者脚本成功调用接口 2、解决关联接口的参数传递。有的接口直接,存在参数的传递,一般的思路,就是将这个参数设置为变量。 3、简化代码。总会有些东西是重…...
MongoDB的索引与聚合
一、实验目的 1. 理解索引的概念及其在MongoDB中的重要性和作用。 2. 学习如何选择适合建立索引的字段。 3. 掌握如何创建、删除索引以及如何强制使用索引。 4. 熟悉MongoDB的聚合框架和MapReduce工具,以及简单聚合命令的使用。 二、实验环境准备 1. JAV…...
Java菜鸟养成计划(java基础)--java运算符
java中的运算符 1、java中的运算符1.1 、 、-、 * 、/ 、 %1.2 、、-、 *、/、%1.3 、、--【自增\自减运算符】1.4、>、 <、 > 、< 、 、! 、! 1.5、&&、||、|、&1.6、&、|、~、^1.7、>> 、 <<、>>>位运算1.8、?:三目运算符…...
除了基本的事件绑定,鸿蒙的ArkUI
鸿蒙操作系统(HarmonyOS)是由华为技术有限公司开发的分布式操作系统,旨在为多种智能设备提供一个统一的操作平台。它不仅适用于智能手机,还适用于平板电脑、智能手表、智能电视等物联网设备。为了使开发者能够更加便捷地创建跨设备…...
0164__【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os
【GNU】gcc -O编译选项 -Og -O0 -O1 -O2 -O3 -Os_gcc -o0-CSDN博客...
vue3组件传值具体使用
问: left.vue文件调用接口获取了后端返回的urlLink字段,我该怎么传递给总的父组件index.vue中,我需要点击父组件的一个按钮来触发跳转? 回答: 在 Vue 3 中使用 TypeScript 和 setup 语法糖时,可以通过 e…...
Web 音视频(二)在浏览器中解析视频
前言 浏览器中已经能直接播放视频,为什么还需要手动写代码解析? 因为,某些场景需要对视频进行更细致的处理,比如截取关键帧、提取视频中的文字、人物打码、极低延时播放视频等等。 总之,除了最单纯的视频播放外&…...
江天科技主要产品销售单价下滑,应收账款、存货周转率大幅下降
《港湾商业观察》廖紫雯 日前,苏州江天包装科技股份有限公司(以下简称:江天科技)冲击北交所,保荐机构为国投证券。 江天科技主要从事标签印刷产品的研发、生产与销售,公司主要产品包括薄膜类和纸张类的不…...
我国的金融组织体系,还有各大金融机构的分类,金融行业的组织
中国金融组织体系介绍 中国金融组织体系是一个复杂而多层次的系统,涵盖了各种类型的金融机构和监管机构。以下是关于中国金融组织体系的详细介绍,包括一行三会等金融监管机构,各大金融机构的分类、涉及的银行以及行业组织。 (一…...
vue md5加密
在Vue中使用MD5加密,你可以使用第三方库如crypto-js。首先,你需要安装这个库: npm install crypto-js --save然后,在你的Vue组件中引入crypto-js并使用其MD5功能: <template><div><input v-model&quo…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证7)
本文验证基于请求头中传递token信息的认证方式,webapi项目的控制器类中新建如下函数,仅通过验证的客户端能调用,需要客户端请求在Header中添加’Authorization’: Bearer token’的键值对且通过token验证后才能调用。 [Authorize] [HttpGet]…...
Ubuntu16.04 安装OpenCV4.5.4 避坑
Ubuntu16.04 安装C版OpenCV4.5.4 Ubuntu16.04 VSCode下cmakeclanglldb调试c 文章目录 Ubuntu16.04 安装C版OpenCV4.5.41. 下载Opencv压缩包2. 安装Opencv-4.5.43. 配置OpenCV的编译环境4.测试是否安装成功 1. 下载Opencv压缩包 下载Opencv压缩包,选择source版本。…...
DDD - 整洁架构_解决技术设计困局
文章目录 Pre如何落地 DDD底层技术的更迭 整洁架构的设计主动适配器/北向适配器被动适配器/南向适配器 整洁架构的落地总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对象的两种设计思路…...
Python自动化运维:一键掌控服务器的高效之道
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在互联网和云计算高速发展的今天,服务器数量的指数增长使得手动运维和管理变得异常繁琐。Python凭借其强大的可读性和丰富的生态系统,成为…...
数论问题61一一各种进位制
10进位制是普遍使用的数进位制,二进位制是计算机采用的进位制。还有三进位制,四进位制,…等等。那一种进位制都能转化为10进位制。下面介绍这种方法。 ①10进位制的表示(口诀:逢10进1) 如8X10007X1005x1038753。 ②2进位制的表示(口诀:逢2…...
Java开发提速秘籍:巧用Apache Commons Lang工具库
一、Java 开发效率之困 在当今数字化时代,Java 作为一门广泛应用的编程语言,在各类软件开发项目中占据着举足轻重的地位。无论是大型企业级应用、互联网平台,还是移动应用后端,都能看到 Java 的身影。然而,Java 开发者…...
终极指南:在Windows上完美重现Mac触控板体验的完整解决方案
终极指南:在Windows上完美重现Mac触控板体验的完整解决方案 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac-precision-touchp…...
JSXBIN反编译工具:面向创意开发者的ExtendScript源代码恢复方案
JSXBIN反编译工具:面向创意开发者的ExtendScript源代码恢复方案 【免费下载链接】jsxer A fast and accurate JSXBIN decompiler. 项目地址: https://gitcode.com/gh_mirrors/js/jsxer 核心价值解析:为何选择Jsxer 在Adobe创意软件生态中&#x…...
AWPortrait-Z问题解决:图像模糊、速度慢?常见问题一键搞定
AWPortrait-Z问题解决:图像模糊、速度慢?常见问题一键搞定 1. 快速诊断:你的问题属于哪一类? 在使用AWPortrait-Z生成人像时,最常见的问题可以归纳为三类: 图像质量问题:模糊、失真、细节不足…...
AI 模型推理 GPU 调度策略优化
AI 模型推理 GPU 调度策略优化 随着人工智能技术的快速发展,AI 模型推理在医疗、金融、自动驾驶等领域的应用日益广泛。GPU 资源的高效调度成为提升推理性能的关键挑战。如何优化 GPU 调度策略,以降低延迟、提高吞吐量并减少资源浪费,成为研…...
开箱即用:基于Qwen3-Embedding-4B的智能文档检索系统搭建实录
开箱即用:基于Qwen3-Embedding-4B的智能文档检索系统搭建实录 1. 引言:为什么选择Qwen3-Embedding-4B 想象一下,你手头有成千上万份技术文档、合同或学术论文,每次查找相关内容都要靠关键词匹配,结果要么漏掉重要信息…...
知识图谱在电商推荐系统中的5个落地场景:从商品关系到用户画像的实践指南
知识图谱在电商推荐系统中的5个落地场景:从商品关系到用户画像的实践指南 当你在电商平台搜索"蓝牙耳机"时,系统不仅会推荐同类商品,还可能智能搭配运动臂包或防水手机壳——这背后正是知识图谱在重新定义推荐逻辑。不同于传统协同…...
收藏!小白程序员必看:5大AI Agent框架深度解析,助你轻松入门大模型时代!
2026年,GitHub上AI Agent相关项目星标总量已突破500万。但大多数团队在选型时只看星星数,结果花3个月踩坑才明白——框架没有最好,只有最合适。今天我们不吹不黑,从架构哲学、学习曲线、生产成熟度、多Agent协作、长任务支持、可观…...
OpenClaw多账户管理:千问3.5-9B自动切换社交平台身份
OpenClaw多账户管理:千问3.5-9B自动切换社交平台身份 1. 为什么需要自动化多账户管理 作为一个长期运营多个社交媒体账号的内容创作者,我每天需要切换不同平台的账号身份。手动登录不仅耗时,还经常遇到浏览器缓存混乱导致账号异常的问题。更…...
别再只看FLOPs了!从VoVNet的OSA模块看高效网络设计的实战误区
从VoVNet的OSA模块看高效网络设计的实战误区:为什么你的模型跑得比论文慢? 当我们在GitHub上复现一篇顶会论文时,最沮丧的瞬间莫过于:明明FLOPs和参数量完全匹配,实际推理速度却比论文报告值慢了30%。这个问题在部署De…...
SD卡速度模式全解析:从High Speed到UHS-III的选型指南
SD卡速度模式全解析:从High Speed到UHS-III的选型指南 在4K视频拍摄、高速连拍相机和工业级数据采集设备中,SD卡的性能往往成为系统瓶颈。我曾为一个医疗影像项目选型时,因误用Class 10的High Speed卡导致DVR设备频繁丢帧,最终发现…...
