通过小程序进度条了解Linux下的多文件操作
发布时间 - 2025-06-21 00:00:00 点击率:次在网络中,进度条随处可见,无论是下载还是上传,进度条都帮助我们判断当前的进展情况。然而,今天我们将讨论的进度条仅具备外观。首先,让我们了解一下回车的概念。
1.1 回车的概念
在计算机出现之前,有一种名为电传打字机(Teletype Model 33)的机械打字机,每秒钟可以打10个字符。但在换行时需要0.2秒,这段时间内如果有新字符传输过来,字符可能会丢失。为了解决这个问题,研发人员在每行结尾添加了两个结束字符:一个是“回车”,指示打字机将打印头定位到左边界而不卷动滚筒;另一个是“换行”,指示打字机卷动滚筒而不改变水平位置。随着计算机的发明,这两个概念被引入计算机中。由于存储器昂贵,一些科学家认为在每行结尾添加两个字符太浪费,因此出现了分歧。
回车 \r 的本义是将光标重新回到本行的开头,英文为return,控制字符为CR(Carriage Return)。换行 \n 的本义是将光标移到下一行(不一定是下一行的行首),英文为newline,控制字符为LF(Line Feed)。
| 符号 | ASCII码 | 意义 |
|---|---|---|
| \n | 10 | 换行NL |
| \r | 13 | 回车CR |
在进度条中,我们需要使用\r来将光标回到一行的开头。
1.2 缓冲区的概念
缓冲区是内存的一部分,用于暂存输入或输出的数据。根据对应的是输入设备还是输出设备,缓冲区分为输入缓冲区和输出缓冲区。当我们使用printf函数时,内容先进入缓冲区,然后再从缓冲区打印到屏幕。由于代码中存在sleep,缓冲区的内容不会立即打印到屏幕,这会影响进度条的运行。因此,需要使用fflush强制将缓冲区的内容输出。输出缓冲区的流是stdout,将stdout作为fflush函数的参数即可输出内容。大家可以尝试以下代码:
#include#include int main(){ printf("hello makefile"); sleep(3); return 0; }
1.3 makefile的准备
为了充分利用Linux下的makefile,本次进度条将分为以下三个文件编写:
progressbar.c progressbar.h test.c
在编写之前,我们先配置makefile的内容:
progressbar:test.o progressbar.o
gcc -o progressbar test.o progressbar.o
test.o:test.c
gcc -c test.c
progressbar.o:progressbar.c
gcc -c progressbar.c
.PHONY:clean
clean:
rm -f progressbar progressbar.o test.o配置完成后,在progressbar.h中编写本次程序可能用到的头文件:
#pragma once #include#include #include #include #include typedef void(*callback_c)(double rate); //函数指针 void progress();//进度条1.0 void progress2(double rate);//进度条2.0
1.4 进度条1.0
旋转光标的存在是为了模拟现实中进度条卡住的情况,判断进度条是否还在运行。
char load[4] = {'|','/','-','\\'};//旋转光标
void progress(){
char str[101];
memset(str,0,sizeof(str));
int i = 0;
for(i = 0;i<100;i++){
str[i] = '#';
printf("[%-100s][%d%%][%c]\r",str,i+1,load[i%4]);
fflush(stdout);
usleep(50000);
}
printf("\n");
}这个进度条仅具备外观,没有实际意义。
1.5 进度条2.0
模拟下载过程,通过当前下载的比例来判断进度。
char p_str[101];
void progress2(double rate){
int cnt = (int)rate;
printf("[%-100s][%.1lf%%][%c]\r",p_str,rate,load[cnt%4]);
fflush(stdout);
p_str[(int)rate] = '#';
}
#include "progressbar.h"
int filesize = 1024*1024*1024;//假设文件大小为1GB
void download(callback_c cb){
//模拟下载过程
srand((unsigned int)time(NULL));//随机下载文件的大小
int total = filesize;//已下载文件的大小
while(total>0)
{
usleep(20000);
int load = rand()%(1024*1024*10);//下载速度0~1MB*10
total-=load;
if(total<0) total = 0;
double rate = (double)(filesize-total)/filesize*100;
cb
(rate);
}
printf("\n");
}
# linux
# ai
# typedef
# printf
# ASCII
# 进度条
# 换行
# 而不
# 英文
# 的是
# 卷动
# 还在
# 让我们
# 有一种
# 但在
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Laravel如何实现一对一模型关联?(Eloquent示例)
*服务器网站为何频现安全漏洞?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel模型关联查询教程_Laravel Eloquent一对多关联写法
Laravel distinct去重查询_Laravel Eloquent去重方法
HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】
简单实现Android验证码
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
Laravel怎么使用Intervention Image库处理图片上传和缩放
高端网站建设与定制开发一站式解决方案 中企动力
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
,交易猫的商品怎么发布到网站上去?
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
如何快速搭建安全的FTP站点?
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
WordPress 子目录安装中正确处理脚本路径的完整指南
如何安全更换建站之星模板并保留数据?
Laravel如何创建自定义Artisan命令?(代码示例)
深圳网站制作培训,深圳哪些招聘网站比较好?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Laravel如何使用Collections进行数据处理?(实用方法示例)
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
SQL查询语句优化的实用方法总结
Laravel如何使用Eloquent进行子查询
iOS验证手机号的正则表达式
如何在橙子建站上传落地页?操作指南详解
Laravel如何使用.env文件管理环境变量?(最佳实践)
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
Laravel PHP版本要求一览_Laravel各版本环境要求对照
JavaScript Ajax实现异步通信
如何续费美橙建站之星域名及服务?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
如何快速生成专业多端适配建站电话?
Java类加载基本过程详细介绍
如何获取免费开源的自助建站系统源码?
Bootstrap整体框架之JavaScript插件架构
网站制作软件免费下载安装,有哪些免费下载的软件网站?
网站制作免费,什么网站能看正片电影?
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
上一篇:《小鱼易连》录屏文件保存位置
下一篇:微信封装的调用微信签名包的类库
上一篇:《小鱼易连》录屏文件保存位置
下一篇:微信封装的调用微信签名包的类库


(rate);
}
printf("\n");
}