在终端实现下载进度条
方案
<?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; }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
2020 年 DevOps 的七大发展趋势
一项权威研究表明:2017 年,DevOps 在市场上创造了 29 亿美元;预计到 2022 年,这个数字将达到 66 亿美元。作为软件项目开发的关键性要素,DevOps 已经深入地影响到了软件世界的整体开发格局。许多专家预测 DevOps 将逐渐成为软件工程的主流模式,并将在 2020 年达到其顶峰。 因此,对于许多研发企业而言,开发人员已不再停留在是否对其感兴趣的层面上了,而是应该撸起袖子,真刀真枪地去实践 DevOps 相关的技术与方法。Hackernoon在引述 Statista 的文章中提到:从 2017 年到 2018 年间,DevOps 的全球使用率增长了 7%。而 IDC 预计 DevOps 的软件市场体量将从 2017 年的 29 亿美元,增长到 2022 年的 66 亿美元 (请参见https://www.idc.com/getdoc.jsp?containerId=US43722718)。 DevOps 具有以下优点: 能够对各种修改需求做出快速的反应。 能够实现灵活的安全部署与编排。 能够建立完善的协作与沟通渠道。 能够快速地识别出代码中的错误或漏洞。 开发团队...
- 下一篇
http client 实现 keep-alive 源码探究
前几天在分享"实现自己的wget"的时候,因为我们的请求是一次性的,http 头里设置的Connection: Close。在HTTP/1.1为了提升HTTP 1.0的网络性能,增加了keepalive的特性。那么浏览器在请求的时候都会加上Connection: Keep-Alive的头信息,是如何实现的呢?我们知道在服务端(nginx)可以通过设置keepalive_timeout来控制连接保持时间,那么http连接的保持需要浏览器(客户端)支持吗?今天咱们一起来通过java.net.HttpURLConnection源码看看客户端是如何维护这些http连接的。 测试代码 package net.mengkang.demo; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class Demo { public static void main(String[] args) throws IOException { test(); test(); } private st...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境