在终端实现下载进度条

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

方案

<?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";

解释说明

  • 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;
}
目录
相关文章
|
弹性计算 自然语言处理 测试技术
30分钟私有部署Deepseek-R1和V3,轻松拥有企业专属超大模型
阿里云计算巢推出了基于 ECS镜像、Vllm和Ray集群的超大模型一键部署方案。该方案通过预置标准化环境的ECS镜像,结合自动化云资源编排模板(如Ros模板),将Deepseek-R1和Deepseek-V3的私有化部署流程简化为一键操作。用户无需深入理解底层技术细节,即可在 30分钟内 快速完成模型环境搭建与服务启动,真正实现“开箱即用”的企业级超大模型服务。
|
运维 DataWorks 关系型数据库
DataWorks产品使用合集之怎么进行全量数据迁移
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
159 2
|
敏捷开发 测试技术
【软件测试】软件测试的基本概念和开发模型
在进行软件测试的学习之前,我们要了解软件测试一些基本概念. 这些基本概念将帮助我们更加明确工作的目标以及软件测试到底要做什么。
|
微服务
阿里云人脸识别 1:N 使用简明示例
基于图像或视频输入进行检测,与注册库比对,实现1:N的人脸识别。适用于人脸登录、VIP人脸识别、人脸通关等无需刷卡验证的场景。目前人脸识别1:N功能暂时还处于公测阶段,开通后可以免费测试试用。下面主要演示1:N 服务的开通及Java程序的调用测试。
9353 0
|
编解码 Android开发 开发者
Android音视频——系统播放器介绍(二)
MediaPlayer 在播放控制时可以是 Paused(暂停)和 Stopped(停止)状态的,且当前的播放时进度可以被调整,当调用 MediaPlayerpause 函数时,MediaPlayer 开始由 Started 状态变成 Paused 状态,这个从 Started 状态到 Paused 状态的过程是瞬间的,反之在播放器内部是异步过程的。在状态更新并调用isPlaying 函数前,将有一些耗时。已经缓冲过的数据流,也要耗费数秒。 当start 函数从Paused 状态恢复回来时,playback 恢复之前暂停时的位置,接着开始播放,这时MediaPlayer的 Paused 状态又
251 0
Android音视频——系统播放器介绍(二)
|
弹性计算 NoSQL Java
通过使用阿里云ECS服务器,我熟悉了一些基本Linux命令的使用,对云服务也有了基本的了解。
我的学习专业是数据科学与大数据技术,我现在正处于大三的上学期,前段时间老师给介绍我实验室的成立,加入实验室后我是通过实验室老师的推荐与介绍了解到了“飞天加速计划-高校学生在家实践”活动,了解到可以用自己的学生身份去申请一个属于自己的服务器,在免费的使用了一段时间之后,也感受到了它存在的好处。并希望能继续使用并挖掘它的众多功能。
|
Java 开发者
泛型,不只是简单类 | 带你学《Java面向对象编程》之六十六
泛型不光可以用在类的定义上,它同样也能用于接口和方法的定义,本节将为读者展示这两类使用方式。
泛型,不只是简单类   | 带你学《Java面向对象编程》之六十六
|
弹性计算 Shell Linux
使用阿里云ECS搭建WordPress博客教程
安装要求:内存:512M以上,推荐768M以上(纯面板约占系统60M内存)硬盘:100M以上可用硬盘空间(纯面板约占20M磁盘空间)系统:CentOS 7.1+ (Ubuntu16.04+.、Debian9.
3141 0
|
物联网 API
手把手学IOT服务端API编程[6、查询设备申请状态]|MVP讲堂
本教程旨在介绍服务器端的API编程接口,基于php脚本的sdk,希望对物联网服务器端有编程需求的有所帮助。阿里云MVP手把手教你!有演示视频,千万别错过!
1398 0