【发布时间】:2011-06-24 19:04:22
【问题描述】:
我有一个需要大约 5 分钟才能执行的 C 程序。所以我在想我是否可以在执行时显示用户的完成百分比或任何类型的交互,因为闪烁的光标有点沉闷。 我正在考虑显示百分比,但我可以以某种方式擦除,例如,如果任务 1 结束,我输入 25%,然后在任务 2 结束后,25% 变为 50%?
在一些好的互动方面给我您的意见 干杯!=)
【问题讨论】:
标签: c shell command-line execution
我有一个需要大约 5 分钟才能执行的 C 程序。所以我在想我是否可以在执行时显示用户的完成百分比或任何类型的交互,因为闪烁的光标有点沉闷。 我正在考虑显示百分比,但我可以以某种方式擦除,例如,如果任务 1 结束,我输入 25%,然后在任务 2 结束后,25% 变为 50%?
在一些好的互动方面给我您的意见 干杯!=)
【问题讨论】:
标签: c shell command-line execution
您可以使用\r 将光标重置到行首,然后在当前文本上重新打印语句。
【讨论】:
使用 int 来保持已完成任务的数量,并在每次完成任务时以某种方式调用 printf:
printf("Completed: %d %%\r", tasks_completed * 25);
【讨论】:
只需将您已完成的任务除以您需要完成的总任务,您就有一个百分比(如果您想将数字中的 . 删除 * 它除以 100)
【讨论】:
不要忘记冲洗。 您只能打印一个点。
printf(".");fflush(stdout);
但你也可以这样做(\b 是退格)。
printf("%02d%%\b\b\b",score);fflush(stdout);
【讨论】:
在控制台中打印时,您可以使用特殊字符“\r”,顾名思义(回车),它将光标放在当前行的第一个字符上。
然后您可以覆盖之前的百分比值,只要您不打印“\n”字符,并确保您打印的新字符串至少与之前的字符串一样长。
我的意思是,例如,您打印“25.5 %\r”,然后打印“26 %\r”,您的显示器会显示类似
26 % %
为确保不会发生这种情况,请在 % 和 \r 之间打印一些空格。
【讨论】:
这允许在一个字符串上打印并返回到开头:
printf("\b\b\b%02d%%", percent);
即后退 3 个字符(如果有),然后正好打印 3 个字符。
【讨论】:
有时可能很难将代码分成 100 个部分来显示完成百分比。 在这种情况下,您可以将“系统时间”考虑在内。
将上一次执行所花费的时间写入文件。
将该时间段设置为 100%,并通过访问系统时钟根据经过的时间打印完成百分比。将某个时间间隔(如 25% 或 50%)的完成百分比与实际程序执行同步。
最后,显示打印 100% 直到实际程序结束。
无论如何,这只是不同的看法。
【讨论】:
这本质上是将两个问题合二为一:
第一个取决于您的程序是如何构建的,并且可能通过在程序流的上下文中考虑问题来最容易地回答。第二种可以通过多种方式完成,其中最简单的已经被其他人解释过,即:
\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 了解更多信息。
更新日志:
【讨论】: