C++控制台进度指示器

kol*_*rie 7 c++ linux console

对于正在执行的任务,实现基于控制台的进度指示器的简单方法是什么,但我无法预测需要多长时间?

当我用Clipper编码时,我常常这样做,而这只是迭代字符'/',' - ','\','|'的问题.并将它们放在同一个地方.

在C++中用于实现(或类似)的任何方式/链接/库?

目标是*nix环境.

编辑:

  • 将标题改为更加连贯和通用;
  • 增加了目标环境.

Zan*_*ynx 23

一个非常简单的方法是打印一个字符串后跟一个'\r'字符.这是回车本身,在大多数控制台上,它将光标返回到行的开头而不向下移动.这允许您覆盖当前行.

如果您正在写入stdout或cout或clog,请记住fflush或std :: flush流以使其立即输出该行.如果您正在写入stderr或cerr,则流是无缓冲的,并且所有输出都是立即的(并且效率低).

更复杂的方法是使用像curses这样的屏幕绘图库.Windows控制台还有其他一些方法可以将它们设置为直接屏幕写入,但我不知道它们是什么.


D.S*_*ley 9

你可以尝试类似的东西:

void
spinner(int spin_seconds) {
    static char const spin_chars[] = "/-\\|";
    unsigned long i, num_iterations = (spin_seconds * 10);
    for (i=0; i<num_iterations; ++i) {
        putchar(spin_chars[i % sizeof(spin_chars)]);
        fflush(stdout);
        usleep(100000);
        putchar('\b');
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,这是非标准的,因为亚秒usleep(),我不确定是否有任何保证可以\b删除一个字符,但它适用于大多数平台.\r如果\b不做的话,你也可以尝试.否则,尝试找到curses的版本.

编辑(诅咒样本)

这应该让你开始:

#include <curses.h>
#include <unistd.h>

void spinner(int spin_seconds) {
    static char const spin_chars[] = "/-\\|";
    unsigned long i, num_iterations = (spin_seconds * 10);
    for (i=0; i<num_iterations; ++i) {
        mvaddch(0, 0, spin_chars[i & 3]);
        refresh();
        usleep(100000);
    }
}

int main() {
    initscr();    /* initializes curses */
    spinner(10);  /* spin for 10 seconds */
    endwin();     /* cleanup curses */
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

确保链接到-lcurses-lncurses.这应该适用于任何类似的UNIX.