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