实现一个命令行进度条一般需要以下几个步骤:
1.确定任务的总进度
即要显示进度条,就必须知道当前任务的总进度,例如复制文件时需要知道文件总大小,而排序算法则需要知道排序总数。在代码实现中,该步骤应该由程序员自己根据具体的需求进行适当的修改。
2.计算当前进度
计算当前进度是进度条显示的关键。进度可以基于已完成的工作量或完成的任务数进行计算。例如,文件复制可以根据已经复制的字节数来计算当前进度,排序算法可以根据完成的排序数来计算。在代码实现中,当前进度和总进度之间进行简单的计算即可。
3.显示进度条
进度条是用于显示当前任务状态的一种特殊控件,它代表当前任务已经完成了多少。 在命令行界面中,通常使用一个字符表示进度条的一个单位,如#,然后将其显示在控制台中,从而实现简单的进度条效果。
下面是一个用C++实现命令行进度条的示例代码:
#include <iostream>
#include <chrono>
#include <thread>
const int total = 100; //任务总进度
void progress_bar(int progress)
{
std::cout << '[';
for (int i = 0; i < progress; i++) {
std::cout << '#';
}
for (int i = 0; i < total - progress; i++) {
std::cout << ' ';
}
std::cout << ']' << '\r';
std::cout.flush();
}
int main()
{
for (int i = 0; i <= total; i++) {
progress_bar(i);
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟程序操作延时
}
std::cout << std::endl;
return 0;
}
上述示例代码中,任务总进度total被设置为100。在progress_bar函数中,用for循环打印进度条,并且使用'\r'将光标移动到行首,这样每次更新进度条时就可以使用同一行的区域。达到进度100%时,程序结束并打印一行结束语。
为了更加贴近实际场景,下面再给出示例代码实现一个复制文件时的进度条。
#include <iostream>
#include <fstream>
#include <chrono>
#include <thread>
#include <filesystem>
const int buffer_size = 1024; //每次复制的字节数
int total_progress = 0; //任务总进度
void progress_bar(int progress)
{
const int barWidth = 60;
std::cout << " [";
int pos = static_cast<int>(barWidth * static_cast<double>(progress) / total_progress);
for (int i = 0; i < barWidth; ++i) {
if (i < pos) std::cout << "=";
else if (i == pos) std::cout << ">";
else std::cout << " ";
}
std::cout << "] " << progress << " %\r";
std::cout.flush();
}
void copy_file()
{
std::ifstream src("source_file.txt", std::ios::binary);
std::ofstream dst("target_file.txt", std::ios::binary);
if (src && dst) {
src.seekg(0, std::ios::end);
total_progress = src.tellg();
src.seekg(0, std::ios::beg);
char buffer[buffer_size];
int progress = 0;
while (src && dst) {
if (src.eof()) break;
src.read(buffer, buffer_size);
dst.write(buffer, src.gcount());
progress += src.gcount();
progress_bar(progress);
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟程序操作延时
}
std::cout << "Copying file done" << std::endl;
}
else {
std::cout << "Failed to open file" << std::endl;
}
}
int main()
{
copy_file();
return 0;
}
上述示例代码中,使用STL库中的iostream和fstream读取和写入文件。在显示进度条时,进度条长度使用了60个字符,整体采用“=”表示,末尾使用“>”表示当前进度,等号和大于号之间使用空格隔开以便于阅读。通过计算文件总字节数,并在每次读取缓冲区后累计已经复制的字节数来计算当前完成的总进度。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用C++实现一个命令行进度条的示例代码 - Python技术站