如何使用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转义码 。