许多命令行工具都实现了基于文本的进度条。像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
将光标移到末尾,这会导致光标快速波动。你们可以通过一点点编译来感受它。任何人都可以提出替代方案来避免这个问题吗?
答案 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)
我建议您阅读系统的termcap和terminfo的手册页,而不是提供一些错误的和不可移植的代码行。一开始有点难以理解,但如果您要开始使用依赖于终端的代码,那么这是必须阅读的。维基百科页面是一个很好的起点,但是也可以让你的系统上的手册页也被读取。
此外,我刚刚意识到你的问题绝对是其他几个问题的duplicate。
答案 4 :(得分:0)
要在终端上使用格式,请查看ANSI escape code。