用C++实现一个命令行进度条的示例代码

实现一个命令行进度条一般需要以下几个步骤:

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技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • ios8 beta4固件下载 苹果iOS8 beta4全型号全版本固件下载地址汇总

    iOS 8 Beta 4固件下载攻略 苹果的iOS 8 Beta 4固件是开发者预览版,提供给开发者测试和调试他们的应用程序。以下是获取iOS 8 Beta 4固件的详细攻略。 步骤1:注册为苹果开发者 在下载iOS 8 Beta 4固件之前,您需要注册为苹果开发者。请按照以下步骤进行注册: 访问苹果开发者网站。 点击“加入Apple开发者计划”按钮。 按照…

    other 2023年8月4日
    00
  • Java递归遍历文件目录代码实例

    下面是“Java递归遍历文件目录代码实例”的完整攻略。 目录 简介 代码实现 示例说明 示例一 示例二 简介 在Java中如何递归地遍历文件目录呢?Java提供了File类,可以很方便地对文件和目录进行操作。我们可以通过File类的listFiles()方法获取当前目录下的所有文件和目录,然后递归地遍历每一个目录。 代码实现 下面是Java递归遍历文件目录的…

    other 2023年6月27日
    00
  • C语言关系运算符实例详解

    C语言关系运算符实例详解 关系运算符用于比较两个变量之间的关系,返回值为真或假。C语言中的关系运算符包括:大于(>),小于(<),等于(==),大于等于(>=),小于等于(<=)和不等于(!=)。本文将通过示例详细讲解这些运算符的使用方式。 大于(>)和小于(<) 大于(>)用于比较左右两边的值,如果左边的值大于右边…

    other 2023年6月27日
    00
  • Linux下自动清理大量文件的方案探究

    请看以下详细攻略: Linux下自动清理大量文件的方案探究 问题背景 在Linux系统中,有时候我们需要处理大量的临时文件或日志文件,这些文件如果不及时清理,会占用大量的磁盘空间,导致操作系统运行缓慢。因此,我们需要一种方便快捷、安全可靠的方式来清理这些大文件。 方案一:使用Crontab定时任务 Crontab是一个在Linux下的定时任务系统,可以在指定…

    other 2023年6月27日
    00
  • ios打包(ipa包)

    以下是iOS打包(ipa包)的完整攻略,包括准备工作、打包步骤、示例说明和注意事项。 准备工作 在进行iOS打包之前,需要完成以下准备工作: 确保已经安装Xcode开发工具。 确保已经注册并获取了有效的开发者账号。 确保已经创建了一个Xcode项目,并完成了开发和测试工作。 确保已经配置了项目的证书和描述文件。 打包步骤 以下是iOS打包的步骤: 打开Xco…

    other 2023年5月8日
    00
  • win10开机后键盘失灵重启才能使用如何解决 键盘重启后可用的解决方法

    Win10开机后键盘失灵重启才能使用如何解决 如果你在使用Windows 10时发现开机后键盘失灵,重启电脑才能使用,那么这篇文章就是为你准备的。我们将为您提供解决此问题的一些方法。 方法1:修复键盘驱动程序 键盘驱动程序可能在某些情况下被损坏,导致键盘失灵。在这种情况下,你需要尝试修复键盘驱动程序,以恢复键盘的正常工作。 在计算机管理器中打开设备管理器。 …

    other 2023年6月27日
    00
  • mybatis中文网

    当然,我很乐意为您提供有关“MyBatis中文网”的完整攻略。以下是详细的步骤和两个示例: 1 MyBatis中文网 MyBatis中文网是一个提供MyBatis框架学习资源的网站,包括文档、示例、教程、API等。以下是使用MyBatis中文网的步骤: 1.1 访问MyBatis中文网 首先,您需要访问MyBatis中文网。您可以在浏览器中输入“https:…

    other 2023年5月6日
    00
  • ubuntugrep命令

    以下是Ubuntu grep命令的完整攻略,包括步骤、示例和注意事项: Ubuntu grep命令攻略 grep命令是一种在Linux和Unix系统中用于搜索文本的命令。它可以搜索文件中的指定文本,并输出包含该文本的行。以下是详细的攻略: 步骤 以下是使用grep命令的步骤: 打开终端。 在Ubuntu系统中,可以使用Ctrl+Alt+T快捷键打开终端。 输…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部