今天使用wget下载ruby源码,因为网速实在缓慢只好等待,等待过程中看着wget的进度条就开始想是怎么实现的了。如图:
此类功能在Linux的控制台软件中是很常见的,Windows下没有什么印象。
因为wget是C语言在Linux上实现的,我首先考虑到的是不是有相关接口,于是就找来那本名著《UINX环境编程》,查阅后并未发现相关API。有同事认为STDOUT也是文件,应该看看文件IO章。于是就仔细学习了那章,复习和巩固了一下知识,虽然看似可以解决这个问题,但感觉操作过于繁琐。
因为进度条的输出在STDOUT,所以我认为是应该理解一下STDOUT的处理机制。在学习STDOUT相关资料时,我发现了 “\r” 这个转义符,代表“回车”。顺藤摸瓜,开始区分一下“回车”和”换行”。以下自回车与换行
在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做"回车",告诉打字机把打印头定位在左边界;另一个叫做"换行",告诉打字机把纸向下移一行。 这就是"换行"和"回车"的来历,从它们的英语名字上也可以看出一二。
后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。
Unix系统里,每行结尾只有"<换行>",即"\n";Windows系统里面,每行结尾是"<回车><换行>",即"\r\n";Mac系统里,每行结尾是"<回车>"。
然后了解到\r会将光标移动到行首,那么只要不进行换行就可以实现在该行刷新输出,进而实现进度条效果了。回忆一下C后,终于可以实现:
#include <stdio.h>
int main(){
int i;
char x[300];
memset(x,0,300);
for(i=0;i<100;i++){
sprintf(&x[0],"%2d",i);
x[2]='%';
x[3+i]='=';
printf("\r%s>",x);
fflush(stdout);
sleep(1);
}
printf("\n");
}
当然,既然原理探究清楚了,那么Ruby实现亦然:
(1..100).each do |x|
printf "\r%s",x.to_s+'%'+'='*x+'>'
sleep 1
end
puts
相关推荐
控制台进度条在命令行界面中提供了一个可视化的反馈,让用户知道一个长时间运行的任务正在执行并接近完成。在VS2019中,我们可以利用C#语言和特定的库来实现这一功能。 首先,`Program.cs`文件是项目的主入口点,...
Python中实现控制台进度条的一种常见方法是使用TQDM库。TQDM(Tqdm: A Fast, Extensible Progress Meter)是一个强大的库,可以自动处理多线程和Jupyter notebook环境。不过,如果我们不依赖任何外部库,也可以手动...
### Python 实现控制台进度条功能详解 在进行长时间运行任务或者批量处理时,向用户展示当前操作的完成情况是非常重要的。进度条作为一种直观且友好的提示方式,可以帮助用户了解程序执行的状态。本文将详细介绍...
在C++、Python、Java等编程语言中,实现控制台进度条的方法各有不同,但核心思想相似。以下是一个简单的Python示例,使用了 ANSI escape codes 来清除当前行并重新打印进度条: ```python import time def ...
总之,控制台进度条是一个实用性很强的功能,在Python中有多种方式可以实现。从基础的转义字符操作到高级的第三方库使用,开发者可以根据实际需要和场景选择合适的方法来为程序添加进度条功能。
---------------------------------------------------------------------------------------------------------------------------------------C#源码
在C++或C中,控制台进度条的实现通常涉及到以下步骤: 1. **计数和循环**:进度条的更新基于一个循环,这个循环根据任务的总步骤或时间来迭代。例如,如果有一个100步的任务,你可以设置一个计数器从0递增到99。 2...
这个"vc控制台进度条示例代码"可能就是教你如何在控制台窗口中创建这样一个效果。下面将详细解释如何实现这一功能。 首先,你需要了解控制台的基本操作,包括使用`std::cout`进行字符输出,以及设置颜色和光标位置...
提醒:传代码的时候,发现FTP操作类的New里面少了对控制台进度条类的初始化,但我重新编辑上传信息时,无法再次上传覆盖,再次特别提醒,如有下载用到,注意在New里面添加。 本人刚好要用到FTP操作相关,但是查遍...
4. **显示更新**:在控制台或用户界面上输出新的文字进度条状态。 在.NET框架中,可以使用System.Windows.Forms命名空间的ProgressBar控件来实现此功能。以下是一个简单的C#示例: ```csharp using System; using ...
通过这个实例,我们可以看到,通过自定义类和简单的控制台输出,可以轻松地在Python控制台中实现进度条效果。这在处理大量数据或者长时间运行的程序时非常有用,因为它提供了可视化的反馈,让用户知道程序还在运行,...
本文将详细介绍如何在Java控制台上实现一个简单的百分比进度条。 首先,我们要明白Java控制台输出的基本原理。在Java中,`System.out.print()` 和 `System.out.println()` 方法用于在控制台上打印文本。`System.out...
本文将介绍Python实现进度条的四种方法,每种方法都有其特点和使用场景。 第一种方法是不使用任何外部库,直接通过Python标准库中的`print`函数和`sys.stdout.flush()`方法实现。这种方法的基本原理是利用转义字符...
在给定的标题和描述中,我们看到的是一个简单的控制台进度条实现,用于展示基本概念,而不是一个复杂算法的实例。 进度条的基本原理是通过更新屏幕上的文本来模拟进度,通常用满格和空格来表示完成和未完成的部分。...
本资源提供了Java实现的环形进度条,具有自定义颜色的功能,可以广泛应用于各种应用场景。 `CircleProgressBar`的使用首先需要在项目中引入相关的依赖。如果是一个Android项目,你可能需要在`build.gradle`文件中...
1. **控制台进度条**:在控制台中,可以利用`System.out.print()`和`System.out.flush()`来逐行更新进度条。通过计算当前进度并替换已打印的字符,可以实现动态效果。 2. **Swing的JProgressBar**:在GUI环境中,`...
### Python 实现控制台中的进度条功能 #### 概述 在进行长时间或未知时长的任务处理时,向用户展示任务进度是非常重要的。这不仅能提升用户体验,还能让用户了解任务是否正常进行。Python 提供了多种方式来实现在...
今天就和大家探讨这个问题:如何在python控制台中实现进度条功 进度条最主要的问题就是所有字符全部在同一行,而且可以修改。 然而当执行print语句的时候,python会在打印完这个语句的同时在结尾加上’\n’,也就是...