在终端实现下载进度条

简介: 在终端实现下载进度条

方案

<?php
// 参考https://mengkang.net/1412.html
$width = exec("tput cols");

$progress = "[]100%";
$del = strlen($progress);
$width = $width - $del;

$progress = "[%-{$width}s]%d%%\r";
for($i=1;$i<=$width;$i++){
    printf($progress,str_repeat("=",$i),($i/$width)*100);
    usleep(30000);
}

echo "\n";
AI 代码解读

解释说明

  • tput cols 获取终端的“宽度”,实际是字符列数;
  • %s我们知道是字符串的占位符;
  • %-{n}s的意思是占位n个字符,不足的用空格补充,这样在输出进度条的时候,最末尾的值的位置就是固定的;
  • %%输出百分号;
  • 最重要的一点,格式的末尾使用了\r则将光标移动到行首,则下次再输出时则把上次的整行覆盖,给人进度条动态变化的效果。

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <unistd.h>

int main()
{
    struct winsize size;
    ioctl(STDIN_FILENO, TIOCGWINSZ, &size);
    int width = size.ws_col;

    const char *progress = "[]100%";
    width = width - strlen(progress);

    char width_str[10] = {0};
    sprintf(width_str,"%d",width);

    char progress_format[20] = {0};

    strcat(progress_format,"[%-");
    strcat(progress_format,width_str);
    strcat(progress_format,"s]%d%%\r");

    // printf("%s\n",progress_format);
    // [%-92s]%d%%\r

    char progress_bar[width+1];
    memset(progress_bar,0,width+1);

    for(int i=1;i<=width;i++){
        strcat(progress_bar,"=");
        printf(progress_format,progress_bar,(i*100/width));
        // 或者使用
        // fprintf(stdout,progress_format,progress_bar,(i*100/width));
        fflush(stdout); // 必须刷新缓存区,否则会显得很卡顿
        usleep(10000);
    }

    printf("\n");
    return 0;
}
AI 代码解读
目录
打赏
0
0
0
0
938
分享
相关文章
30分钟私有部署Deepseek-R1和V3,轻松拥有企业专属超大模型
阿里云计算巢推出了基于 ECS镜像、Vllm和Ray集群的超大模型一键部署方案。该方案通过预置标准化环境的ECS镜像,结合自动化云资源编排模板(如Ros模板),将Deepseek-R1和Deepseek-V3的私有化部署流程简化为一键操作。用户无需深入理解底层技术细节,即可在 30分钟内 快速完成模型环境搭建与服务启动,真正实现“开箱即用”的企业级超大模型服务。
oracle日期加减的三种方式
【8月更文挑战第15天】在Oracle数据库中,可通过三种方式对日期进行加减操作:一是利用`ADD_MONTHS`函数增减月份,如`ADD_MONTHS(SYSDATE, 2)`表示两个月后;二是运用算术运算符直接加减天数,如`SYSDATE + 7`表示七天后;三是采用`INTERVAL`表达式增加或减少特定时间间隔,如`SYSDATE + INTERVAL &#39;2&#39; YEAR`表示两年后。这些方法可根据实际需求灵活选用。
3941 5
Vue3输入框(Input)
这是一个基于 Vue 的输入框组件库,提供了丰富的自定义选项与功能。通过参数设置可以调整输入框的尺寸、前后缀图标及标签等,并支持密码输入、显示字数统计、禁用状态等功能。
392 2
Vue3输入框(Input)
[初学者必看]JavaScript 简单实际案例练习,锻炼代码逻辑思维
【6月更文挑战第2天】这是一个前端小项目合集,包括图片轮播器、动态列表、模态框、表单验证等14个项目,旨在帮助初学者提升编码技能和实战经验。每个项目提供关键提示,如使用HTML、CSS和JavaScript实现不同功能,如事件监听、动画效果和数据处理。通过这些项目,学习者可以锻炼前端基础并增强实际操作能力。
318 2
开源项目推荐:IM开源即时通讯软件收集,请重点关注Telegram/野火/flamingo
开源项目推荐:IM开源即时通讯软件收集,请重点关注Telegram/野火/flamingo
4347 0
docker的小秘密--digests仓库校验码(如何修改digests)
docker的小秘密--digests仓库校验码(如何修改digests)
435 0
docker的小秘密--digests仓库校验码(如何修改digests)
ByteBuf 和 ByteBuffer 的区别, ByteBuf 动态扩容源码分析
ByteBuf 和 ByteBuffer 的区别, ByteBuf 动态扩容源码分析
676 0
怎么获取echarts需要的geoJson数据去渲染地图:以广州市白云区24镇街为例(内附资源)
怎么获取echarts需要的geoJson数据去渲染地图:以广州市白云区24镇街为例(内附资源)
762 0
怎么获取echarts需要的geoJson数据去渲染地图:以广州市白云区24镇街为例(内附资源)
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等