如何使用printf制作“进度条”?

时间:2014-01-06 09:48:48

标签: c printf

许多命令行工具都实现了基于文本的进度条。像rpm安装一样:

  

安装############## [45%]

#随百分比增长,同时保持单行。我想要的是类似的东西:我需要一个只需一行的进度指示器,也就是说,当百分比增长时,它被覆盖,而不是换新行({​​{1}})。

我试过了:

\n

#include <stdio.h> int main (){ int i = 0; for (i = 0; i < 10000; i++){ printf("\rIn progress %d", i/100); } printf("\n"); } 可以覆盖单行。但是,\r将光标移到行的开头,\r将光标移到末尾,这会导致光标快速波动。你们可以通过一点点编译来感受它。任何人都可以提出替代方案来避免这个问题吗?

5 个答案:

答案 0 :(得分:12)

这是缓存stdout流的问题。您必须在\n之后使用fflush(stdout)显式刷新它(使用printf()进行隐式刷新):

fflush(stdout);

答案 1 :(得分:3)

这是rpm如何做到的,也许你可以为自己的目的写一个类似的东西:printHash

rpm使用\b代替\r逐字符删除输出行。

答案 2 :(得分:1)

我相信使用

printf("\e[?25l");

或许可以提供帮助。这将隐藏光标。老实说,我不确定再次使用/ r或printf是否会覆盖该位代码并显示光标,但值得一试。此外,以下代码可用于再次显示光标。

printf("\e[?25h");

答案 3 :(得分:1)

我建议您阅读系统的termcapterminfo的手册页,而不是提供一些错误的和不可移植的代码行。一开始有点难以理解,但如果您要开始使用依赖于终端的代码,那么这是必须阅读的。维基百科页面是一个很好的起点,但是也可以让你的系统上的手册页也被读取。

此外,我刚刚意识到你的问题绝对是其他几个问题的duplicate

答案 4 :(得分:0)

要在终端上使用格式,请查看ANSI escape code