设计一个简单的进度条,在最后立即从0->100%到C++

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

本文关键字:最后 gt C++ 100% 一个 简单      更新时间:2023-10-16

我想通过打印一个"X"字符来制作一个非常基本的进度指示器,以便在循环再进行 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;
}

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

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

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

cout << 'X' << flush;