在C中执行时显示%已完成

时间:2011-02-10 11:22:53

标签: c shell command-line execution

我有一个C程序需要5分钟才能执行。所以我在想,我是否可以在执行时显示已完成的百分比或用户的任何类型的交互,因为闪烁的光标有点沉闷。 我正在考虑显示百分比,但我可以在某种程度上擦除,例如,如果任务1结束我放25%然后在任务2结束后25%变为50%?

在一些良好的互动中给我你的意见 欢呼!=)

8 个答案:

答案 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了解更多信息。

更新日志:

  • 重写了最后一段
  • 用我的初始bash示例替换 一个例子

答案 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%直到实际程序结束。 无论如何,这只是一个不同的观点。