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

Syn*_*ror 4 c shell command-line execution

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

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

gam*_*men 7

这基本上是两个问题:

  • 如何根据任务流程计算百分比
  • 如何呈现计算

第一个取决于你的程序是如何构建的,并且通过在程序流程的上下文中思考问题可能最容易回答.第二种方式可以通过多种方式完成,其中最简单的方法已经由其他方式解释,即:

  • 使用\r跳转到行的开头
  • 使用\bx次将光标向后移动

我已经使用了尚未提及的第三种方法,即保存恢复光标位置.这允许您任意移动光标.

  • \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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们并不关心行的开头位置:我们只重印实际百分比.您会注意到光标位置现在在百分比之前可见,但您可以随意将其移动到您喜欢的任何位置.

此解决方案假定您的终端能够理解这些ANSI命令,这些命令可能因终端而异.虽然我认为上述方法相对"安全",但请查看 terminfo/ncurses以获取更多信息.

更新日志:

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


Sir*_*ius 5

在控制台中打印时,可以使用特殊字符"\ r \n",顾名思义(回车),将光标放在当前行的第一个字符上.

然后,只要不打印"\n"字符,就可以覆盖以前的百分比值,并确保打印的新字符串至少与前一个字符串一样长.

我的意思是,例如,你打印"25.5%\ r \n",然后"26%\ r \n",你的显示器会显示类似的东西

26 % %

为了确保不会发生这种情况,请在%和\ r之间打印几个空格.