一个简单的 cout 进度条的设计在 C++ 结束时立即从 0->100%

Design of a simple progress bar to cout goes from 0->100% instantly at the end in C++

我想制作一个非常基本的进度指示器,方法是在每次循环再进行 10% 时打印一个 'X' 字符来计算。我正在尝试按照下面粘贴的代码所示执行此操作,但它似乎并没有起作用——实际上它似乎应该起作用。

它应该在整个循环中显示稳定的进度,但我却在循环完成后立即获得所有 X。这并不是因为循环完成得太快以至于我无法察觉。要验证这一点,您可以在 "TOTAL" 中添加一个额外的 'F' 以显着增加循环的持续时间,您会发现这不仅仅是一个感知问题。

知道是什么原因造成的吗?

#include <iostream>
#define TOTAL 0xFFFFFFF
using namespace std;

int main(void) {

    //Make a counter for counting loops
    double counter = 0;
    // Set it to trigger after each 10% of progress
    double counterMax = TOTAL / 10;

    cout << "Starting now..." << endl;

    for (double i = 0; i < TOTAL; i++) {
        // Do something... anything
        i++;
        i--;
        // Increment the counter
        counter++;
        // Print an X when the counter exceeds the 10%
        // trigger point, and then reset the counter.
        if (counter > counterMax) {
            cout << 'X';
            counter = 0;
        }
    }
    cout << endl << "Done!";

    return 0;
}

系统input/output 调用通常是缓慢的操作。为了提高程序的效率,输入和输出流经常被缓冲,以减少对操作系统的调用次数。

当程序需要 "non-buffered" 输出时,一种解决方案是使用缓冲输出函数,并简单地 "flush" 输出以确保操作系统处理已在任何缓冲区中排队的任何输出.

当输出缓冲区已满,或流关闭时,它会自动刷新。标准输出也会被某些序列自动刷新,比如 endl。但是您可以通过调用 cout.flush() 或使用 flush 操纵器在任何时候触发标准输出的刷新,例如:

cout << 'X' << flush;