如何使用printf制作“进度条”?
许多命令行工具实现了基于文本的进度条。 像rpm安装一样:
安装############## [45%]
#
随着百分比的增长而增长,同时保持一条线 。 我想要的是类似的东西:我需要一个只需一行的进度指示器,也就是说,当百分比增长时,它被覆盖,而不是创建一个新行( \n
)。
我试过这个:
#include int main (){ int i = 0; for (i = 0; i < 10000; i++){ printf("\rIn progress %d", i/100); } printf("\n"); }
\r
工作覆盖单行。 但是, \r
将光标移到行的开头, printf
将光标移到末尾,这导致光标快速波动。 你们可以通过一点编译来感受它。 任何人都可以提出替代方案来避免这个问题吗?
这是缓冲的stdout
流的问题。 您必须在printf()
之后使用fflush(stdout)
显式刷新它(使用\n
进行隐式刷新printf()
:
fflush(stdout);
这是rpm如何做到的,也许你可以为自己的目的写一个类似的东西: printHash 。
rpm
使用\b
而不是\r
来逐字符擦除输出行。
我相信使用
printf("\e[?25l");
也许可以提供帮助。 这将隐藏光标。 老实说,我不确定再次使用/ r或printf是否会覆盖那段代码并显示光标,但值得一试。 此外,以下代码可用于再次显示光标。
printf("\e[?25h");
我建议您阅读系统的termcap和terminfo的手册页,而不是给出一些错误的和不可移植的代码行。 一开始有点难以理解,但如果您要开始使用依赖于终端的代码,那么这是必须阅读的。 维基百科页面是一个很好的起点,但是也可以将系统上的手册页也读取。
此外,我刚刚意识到你的问题绝对是一些其他问题的重复 。
要在终端上使用格式,请检查ANSI转义码 。