通过小程序进度条了解Linux下的多文件操作

在网络中,进度条随处可见,无论是下载还是上传,进度条都帮助我们判断当前的进展情况。然而,今天我们将讨论的进度条仅具备外观。首先,让我们了解一下回车的概念。

1.1 回车的概念

在计算机出现之前,有一种名为电传打字机(Teletype Model 33)的机械打字机,每秒钟可以打10个字符。但在换行时需要0.2秒,这段时间内如果有新字符传输过来,字符可能会丢失。为了解决这个问题,研发人员在每行结尾添加了两个结束字符:一个是“回车”,指示打字机将打印头定位到左边界而不卷动滚筒;另一个是“换行”,指示打字机卷动滚筒而不改变水平位置。随着计算机的发明,这两个概念被引入计算机中。由于存储器昂贵,一些科学家认为在每行结尾添加两个字符太浪费,因此出现了分歧。

回车 的本义是将光标重新回到本行的开头,英文为return,控制字符为CR(Carriage Return)。换行 的本义是将光标移到下一行(不一定是下一行的行首),英文为newline,控制字符为LF(Line Feed)。

符号 ASCII码 意义

10换行NL13回车CR

在进度条中,我们需要使用来将光标回到一行的开头。

1.2 缓冲区的概念

缓冲区是内存的一部分,用于暂存输入或输出的数据。根据对应的是输入设备还是输出设备,缓冲区分为输入缓冲区和输出缓冲区。当我们使用printf函数时,内容先进入缓冲区,然后再从缓冲区打印到屏幕。由于代码中存在sleep,缓冲区的内容不会立即打印到屏幕,这会影响进度条的运行。因此,需要使用fflush强制将缓冲区的内容输出。输出缓冲区的流是stdout,将stdout作为fflush函数的参数即可输出内容。大家可以尝试以下代码:

通过小程序进度条了解Linux下的多文件操作

#include #include int main(){    printf("hello makefile");    sleep(3);    return 0;}

1.3 makefile的准备

为了充分利用Linux下的makefile,本次进度条将分为以下三个文件编写:

文小言 文小言

百度旗下新搜索智能助手,有问题,问小言。

文小言 57 查看详情 文小言

progressbar.c  progressbar.h  test.c

在编写之前,我们先配置makefile的内容:

progressbar:test.o progressbar.o    gcc -o progressbar test.o progressbar.otest.o:test.c    gcc -c test.cprogressbar.o:progressbar.c    gcc -c progressbar.c.PHONY:cleanclean:    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.0void 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]",str,i+1,load[i%4]);        fflush(stdout);        usleep(50000);    }    printf("");}

这个进度条仅具备外观,没有实际意义。

1.5 进度条2.0

模拟下载过程,通过当前下载的比例来判断进度。

char p_str[101];void progress2(double rate){    int cnt = (int)rate;    printf("[%-100s][%.1lf%%][%c]",p_str,rate,load[cnt%4]);    fflush(stdout);    p_str[(int)rate] = '#';}#include "progressbar.h"int filesize = 1024*1024*1024;//假设文件大小为1GBvoid 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("");}

以上就是通过小程序进度条了解Linux下的多文件操作的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/485783.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 13:21:05
下一篇 2025年11月8日 13:21:56

相关推荐

  • 云原生中的联邦学习如何与微服务结合?

    联邦学习在云原生中通过微服务化实现分布式协作:1. 协调器服务调度训练与聚合;2. 本地训练服务执行边缘计算;3. 模型存储支持版本管理;4. 安全通信保障隐私;5. API驱动协同流程;6. 服务网格增强治理;7. 弹性伸缩适配边缘计算。 联邦学习在云原生环境中与微服务结合,主要通过将模型训练逻辑…

    2025年12月17日
    000
  • .NET 中的日期时间处理在全球化下的注意事项?

    应统一使用UTC存储时间,并通过TimeZoneInfo进行时区转换,结合DateTimeKind和DateTimeOffset确保时间上下文准确,再按用户文化格式化显示。 在 .NET 中进行日期时间处理时,若应用面向全球用户,必须考虑不同时区、文化差异和夏令时变化。忽略这些因素可能导致时间显示错…

    2025年12月17日
    000
  • WinForms中如何实现自定义控件的绘制?

    答案:自定义控件绘制需重写OnPaint方法,利用Graphics对象进行绘图,并通过Invalidate()触发重绘;性能优化包括启用双缓冲、局部刷新、缓存绘制结果及避免频繁创建GDI对象;用户交互通过处理鼠标键盘事件改变控件状态并触发重绘实现;结合GraphicsPath、变换、渐变等GDI+高…

    2025年12月17日
    000
  • 微服务中的领域服务与应用服务区别?

    领域服务专注业务规则实现,如transferMoneyFromTo,位于领域层;应用服务协调用例流程,如用户下单,位于应用层,两者分属不同层级,职责分离确保架构清晰。 在微服务架构中,领域服务和应用服务是两种不同层次的服务类型,它们职责分明,服务于不同的目的。 领域服务:聚焦业务逻辑 领域服务属于领…

    2025年12月17日
    000
  • ASP.NET Core 中的标记帮助器如何创建组件?

    标记帮助器用于增强HTML标签行为而非创建组件,如EmailTagHelper可将自定义标签转为邮件链接;若需复用UI应选View Components或Razor组件。 在 ASP.NET Core 中,标记帮助器(Tag Helper)并不是用来“创建组件”的工具,而是用于在 Razor 视图中…

    2025年12月17日
    000
  • C#环境变量怎么设置正确

    c#环境变量设置的核心是将.net sdk路径添加到系统path变量以确保dotnet命令可用。在windows上,通过“高级系统设置”中的“环境变量”编辑path,加入类似c:program filesdotnet的路径;若安装多个sdk版本,路径顺序决定默认使用的版本。此外,环境变量如aspne…

    2025年12月17日
    000
  • 如何使用 SpecFlow 为 .NET 微服务编写 BDD 测试?

    使用 SpecFlow 实现 .NET 微服务 BDD 测试,首先通过 Gherkin 编写可读性强的 .feature 文件描述业务行为,如定义“查询订单状态”场景;接着在 C# 中创建步骤定义类,用正则绑定 Gherkin 步骤到具体实现,调用 API 并验证响应;然后集成 WebApplica…

    2025年12月17日
    000
  • ASP.NET Core 中的端点过滤器如何拦截请求?

    端点过滤器在路由匹配后、执行前拦截请求,通过实现EndpointFilter或使用委托,可验证、修改或阻止特定端点的请求。 端点过滤器通过在请求处理管道中插入自定义逻辑,实现对特定端点的请求拦截。它们运行在路由匹配之后,实际执行端点之前,可以用来验证、修改或阻止请求。 端点过滤器的基本作用机制 AS…

    2025年12月17日
    000
  • C# 中的 Span 如何提升性能?

    Span通过避免内存复制和减少GC压力显著提升性能,它提供统一接口访问栈、堆或本机内存,支持零拷贝切片操作,如解析字符串字段时不创建临时对象;利用ReadOnlySpan可优化只读场景的字符串处理,延迟分配并降低开销,在热路径中替代传统Substring或数组拷贝能极大提高效率。 <img s…

    好文分享 2025年12月17日
    000
  • 如何使用 ML.NET 为微服务添加机器学习功能?

    明确业务场景并准备数据,如用户行为分类、订单预测等,确保结构化数据来源清晰;2. 使用ML.NET的MLContext构建训练管道,定义数据结构与算法,训练二分类或回归模型;3. 保存模型至文件并在微服务启动时加载,通过PredictionEngine实现实时预测;4. 将模型推理集成到API中,结…

    2025年12月17日
    000
  • 如何使用 Polly 在 .NET 中实现弹性策略?

    Polly提升.NET应用容错能力,支持重试、熔断、超时等策略。1. 安装Polly及Polly.Extensions.Http包;2. 定义重试、断路器、超时策略;3. 使用PolicyWrap组合策略;4. 推荐与IHttpClientFactory集成实现自动策略注入,增强HTTP客户端弹性。…

    2025年12月17日
    000
  • .NET 中的性能诊断工具有哪些?

    .NET常用性能诊断工具包括:1. Visual Studio诊断工具用于开发阶段CPU、内存分析;2. JetBrains的dotMemory和dotTrace进行深度内存与CPU分析;3. PerfView擅长ETW事件采集,适合生产环境GC与异常分析;4. dotnet-trace和dotne…

    2025年12月17日
    000
  • 什么是 Kubernetes 的 Ingress,如何配置 .NET 服务?

    Ingress是Kubernetes中管理外部访问的API资源,通过域名和路径将HTTP/HTTPS请求路由到集群内服务。它需配合Ingress Controller(如Nginx)实现第7层负载均衡,支持TLS加密、路径重写等功能。部署.NET服务时,先创建Deployment和ClusterIP…

    2025年12月17日
    000
  • C# 中的命名参数在 API 设计中的优势?

    命名参数通过显式指定参数名提升代码可读性,使多参数调用更清晰;支持参数顺序无关性,增强可维护性并减少错误;结合可选参数可跳过中间项直接设置所需值,优化API易用性与安全性。 命名参数在 C# 中允许调用方法时明确指定参数名称,这在 API 设计中带来了显著的优势,尤其提升了代码的可读性和易用性。 提…

    2025年12月17日
    000
  • C#中如何使用LINQ to SQL进行数据库查询?基本语法是什么?

    首先建立数据上下文和实体类映射,然后使用LINQ语法进行查询、排序、分页等操作,通过SubmitChanges提交增删改。 在C#中使用LINQ to SQL进行数据库查询,首先需要建立数据模型与数据库表的映射关系。它允许你用类似SQL的语法直接在C#代码中操作数据库,使查询更直观、类型安全。 1.…

    2025年12月17日
    000
  • 如何使用 MassTransit 在 .NET 中实现消息队列?

    答案:在.NET中使用MassTransit集成RabbitMQ需定义消息契约、配置总线、创建消费者并发布消息。首先用record定义消息如public record GettingStarted { public string Value { get; init; } },存于Contracts文…

    2025年12月17日
    000
  • ASP.NET Core 中的路由约束如何定义?

    路由约束用于限制URL占位符匹配,如{ id:int }只匹配整数,支持类型、格式及范围验证,提升应用健壮性。 在 ASP.NET Core 中,路由约束用于限制 URL 路径中占位符的匹配方式,确保传入的参数符合特定格式或类型。通过定义约束,可以避免无效请求进入控制器,提升应用的健壮性。 使用内联…

    2025年12月17日
    000
  • 如何用 Kubernetes Operators 管理 .NET 有状态服务?

    使用 Operator 可自动化管理 .NET 有状态服务,解决持久化、配置、扩缩容等挑战。通过 CRD 定义期望状态,控制器自动创建 StatefulSet、PVC 等资源并维护其生命周期,支持备份、健康检查与滚动更新。结合 Helm 可简化部署,Operator 封装运维逻辑,使 .NET 应用…

    2025年12月17日
    000
  • C# 中的本地函数如何改善代码结构?

    本地函数提升C#代码可读性与维护性,通过将仅在方法内使用的逻辑封装为内部函数,避免命名污染并减少参数传递。如ProcessInput中IsValid和Format直接访问input,CalculateTax中ApplyRate使用外部变量taxable,无需传参。相比匿名委托,本地函数性能更优且调试…

    2025年12月17日
    000
  • 如何使用 Cucumber 为 .NET 微服务编写验收测试?

    使用 SpecFlow 实现 Cucumber 验收测试,通过 Gherkin 语法编写用户登录场景,绑定步骤定义到 C# 代码,调用 API 验证状态码和响应内容,结合 NUnit 运行测试并集成报告工具,确保 .NET 微服务行为符合业务需求。 为 .NET 微服务编写 Cucumber 验收测…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信