【问题标题】:How to make a "progress bar" using printf? [duplicate]如何使用 printf 制作“进度条”? [复制]
【发布时间】:2014-01-06 09:48:48
【问题描述】:

许多命令行工具都实现了基于文本的进度条。喜欢rpm安装:

安装##############[45%]

# 随百分比增长,同时保持在一行。我想要的是类似的东西:我需要一个只占用一行的进度指示器,也就是说,当百分比增长时,它被覆盖,而不是换行(\n)。

我试过了:

   #include <stdio.h>

   int main (){
       int i = 0;
       for (i = 0; i < 10000; i++){
           printf("\rIn progress %d", i/100);
       }
       printf("\n");
   }

\r 用于覆盖单行。但是,\r 将光标移至行首,printf 将光标移至行尾,导致光标快速摆动。大家稍微编译一下就可以感受到了。任何人都可以想出替代方案来避免这个问题吗?

【问题讨论】:

    标签: c printf


    【解决方案1】:

    这是stdout 流被缓冲的问题。您必须在printf() 之后使用fflush(stdout) 显式刷新它(使用\n 进行隐式刷新):

    fflush(stdout);
    

    【讨论】:

    • 谢谢!它工作正常。其实我对缓冲流的概念很少,您能详细解释一下或进一步参考吗?
    【解决方案2】:

    这是 rpm 的做法,也许您可​​以为自己的目的编写类似的:printHash

    rpm 使用\b 而不是\r 逐字符擦除输出行。

    【讨论】:

      【解决方案3】:

      我相信使用

      printf("\e[?25l");
      

      或许能帮上忙。这将隐藏光标。老实说,我不确定再次使用 /r 或 printf 是否会覆盖那段代码并显示光标,但值得一试。另外,下面的代码可以用来再次显示光标。

      printf("\e[?25h");
      

      【讨论】:

        【解决方案4】:

        与其给出一些错误和不可移植的代码行,我建议您通读系统的termcapterminfo 的手册页。一开始有点难以理解,但如果您要开始使用依赖于终端的代码,那么它是必读的。 Wikipedia 页面是一个不错的起点,但也请阅读系统上的手册页。

        我刚刚意识到您的问题绝对是其他几个问题中的duplicate

        【讨论】:

        • 感谢您的信息。我要感谢所有指导我学习一些我不知道的重要主题的人。
        【解决方案5】:

        要在终端上使用格式,请检查ANSI escape code

        【讨论】:

          猜你喜欢
          • 2011-04-26
          • 1970-01-01
          • 2012-02-07
          • 2021-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多