一个简单的 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;
我想制作一个非常基本的进度指示器,方法是在每次循环再进行 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;