我有一个C程序需要5分钟才能执行。所以我在想,我是否可以在执行时显示已完成的百分比或用户的任何类型的交互,因为闪烁的光标有点沉闷。 我正在考虑显示百分比,但我可以在某种程度上擦除,例如,如果任务1结束我放25%然后在任务2结束后25%变为50%?
在一些良好的互动中给我你的意见 欢呼!=)
答案 0 :(得分:7)
这基本上是两个问题:
第一个取决于你的程序是如何构建的,并且通过在程序流程的上下文中思考问题可能最容易回答。第二种方式可以通过多种方式完成,其中最简单的方法已经由其他人解释过,即:
\r
跳转到该行的开头\b
x次将光标移回我使用了第三种尚未提及的方法,即保存和恢复光标位置。这允许您任意移动光标。
\e[s
存储当前光标位置\e[u
将光标恢复到该位置以下是一个例子:
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[]) {
int i;
int tasks = 25;
printf("Progress:\e[s");
for(i = 0; i < tasks; i++) {
int pct = ((float) i / tasks) * 100;
printf(" %2d (%3d%%)\e[u", i, pct);
fflush(stdout);
sleep(1);
}
return(0);
}
请注意,我们并不关心该行的开头位置:我们只重新打印实际百分比。您会注意到光标位置现在在百分比之前可见,但您可以随意将其移动到任何您喜欢的位置。
此解决方案假设您的终端能够理解这些ANSI命令,可以在终端之间有所不同。虽然我认为上述方法相对“安全”,但请查看terminfo / ncurses了解更多信息。
更新日志:
答案 1 :(得分:5)
在控制台中打印时,您可以使用特殊字符“\ _ \”,顾名思义(回车),将光标放在当前行的第一个字符上。
然后,只要不打印“\ n”字符,就可以覆盖以前的百分比值,并确保打印的新字符串至少与前一个字符串一样长。
我的意思是,例如,您打印“25.5%\ r \ n”,然后打印“26%\ r \ n”,您的显示屏将显示类似
的内容 26 % %
为了确保不会发生这种情况,请在%和\ r之间打印几个空格。
答案 2 :(得分:1)
您可以使用\r
将光标重置为该行的开头,然后在当前文本上重新打印该语句。
答案 3 :(得分:1)
使用一个int来保持任务完成次数,并在每次完成任务时以某种方式调用printf:
printf("Completed: %d %%\r", tasks_completed * 25);
答案 4 :(得分:1)
简单地将您完成的任务除以您需要完成的总任务,并且您有一个百分比(如果您想删除数字中的。*它除以100)
答案 5 :(得分:1)
这允许在一个字符串上打印并返回到开头:
printf("\b\b\b%02d%%", percent);
即。退后3个字符(如果有的话)然后打印3个字符。
答案 6 :(得分:0)
别忘了冲洗。 您只能打印一个点。
printf(".");fflush(stdout);
但你也可以这样做(\ b是退格)。
printf("%02d%%\b\b\b",score);fflush(stdout);
答案 7 :(得分:0)
有时可能很难将代码分成100个部分,以显示完成百分比。 在这种情况下,您可以考虑“系统时间”。
将先前执行中的时间写入文件。 将该时间段设置为100%,并根据访问系统时钟所经过的时间打印完成百分比。在某些时间间隔内完成百分比完成,如25%或50%,与实际程序执行同步 最后,显示打印100%直到实际程序结束。 无论如何,这只是一个不同的观点。