在终端实现下载进度条

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

方案

<?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;
}
目录
相关文章
|
7月前
|
Linux 开发者 iOS开发
QT:基于QMediaPlayer制作的视频播放器(最下方有整合包,可直接运行)
QMediaPlayer是Qt多媒体模块中的一个核心类,它提供了播放音频和视频内容的功能。这个类的设计旨在简化跨平台的媒体播放,使得开发者能够在多种操作系统(如Linux、Windows、macOS及移动平台)上轻松集成多媒体播放能力到他们的应用中,而无需关心底层实现细节。以下是关于QMediaPlayer的一些关键点:
791 1
成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题
成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题
成功解决百度网盘下载文件时遇到 下载总进度一直处于99.9%,显示一直下载不下来的问题
宝塔打开后,内容渲染失败(405)【了解一下】
宝塔打开后,内容渲染失败(405)【了解一下】
112 0
|
9月前
|
定位技术 C++ Python
ArcMap软件卡在加载界面且闪退无法打开的多种解决办法
ArcMap软件卡在加载界面且闪退无法打开的多种解决办法
405 1
|
9月前
|
编解码 前端开发 API
用Python下载壁纸并自动更换桌面
用Python下载壁纸并自动更换桌面
谷歌浏览器下载的内容老是自动打开
原因是每次下载内容在浏览器左下角都有提示,一般都是选择打开所在文件夹,一次手残,点了总是打开此文件导致一下载文件就自动打开。
1092 0
谷歌浏览器下载的内容老是自动打开
|
缓存 网络协议 Java
*(已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
*(已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
*(已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
|
Python
pycharm只显示当前文件,不显示多个文件并排窗口的解决办法
pycharm只显示当前文件,不显示多个文件并排窗口的解决办法
688 0
pycharm只显示当前文件,不显示多个文件并排窗口的解决办法
一日一技:命令行进度条是什么原理?
一日一技:命令行进度条是什么原理?
293 0
一日一技:命令行进度条是什么原理?
使用HBuilder X编辑器安装终端窗口插件未响应的解决方案
使用HBuilder X编辑器安装终端窗口插件未响应的解决方案

热门文章

最新文章