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

yizhihongxing

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

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日

相关文章

  • 电脑鼠标右键菜单的“新建”消失不见了怎么办

    好的。针对电脑鼠标右键菜单的“新建”消失不见了,可以采用以下几步来解决。 方法一:修改注册表 按下“Win + R”组合键,打开“运行”窗口; 输入“regedit”并回车进入注册表编辑器; 找到路径“HKEY_CLASSES_ROOT.rar”(如果是其他文件格式,就找到对应的路径),看看它的子项“ShellNew”是否存在; 如果“ShellNew”不存…

    other 2023年6月27日
    00
  • java实现TCP socket和UDP socket的实例

    Java实现TCP Socket和UDP Socket是网络编程中非常常见的任务。在此,我将向你介绍Java实现TCP和UDP Socket的完整攻略。 TCP Socket 步骤 Java实现TCP Socket的步骤如下: 1.创建一个ServerSocket对象,绑定IP地址和端口号 ServerSocket serverSocket = new Se…

    other 2023年6月27日
    00
  • 基于PostgreSQL/openGauss 的分布式数据库解决方案

    1. 基于PostgreSQL/OpenGauss的分布式数据库解决方案 PostgreSQL/OpenGauss是开源的关系型数据库管理系统。这种数据库管理系统支持高度灵活和可扩展性的结构化数据存储和查询。 使用PostgreSQL/OpenGauss,我们可以轻松地实现分布式数据库解决方案。下面是实现基于PostgreSQL/OpenGauss的分布式数…

    other 2023年6月26日
    00
  • 在c#中将double转换为int

    在C#中将double转换为int的过程可以使用强制类型转换或者Math类中的Round方法来实现。下面将分别介绍这两种方法,并提供示例说明。 强制类型转换 强制类型转换是将一种数据类型转换为另一种数据类型的方法。在C#中,可以使用强制类型转换将double类型转换为int类型。强制类型转换的语法如下: int intValue = (int)doubleV…

    other 2023年5月8日
    00
  • knockoutjs快速入门(经典)

    knockoutjs快速入门(经典) 什么是knockoutjs? knockoutjs是一款专门为web前端开发而设计的Javascript框架,为开发者提供了优秀的MVVM架构支持,它能够让您更加高效、快速地开发出高质量的Web应用程序。有了knockoutjs,您不仅能够方便地处理数据的双向绑定,还可以使用自定义函数、计算属性等高级功能快速构建出数据驱…

    其他 2023年3月29日
    00
  • C++模拟实现JDK中的ArrayList和LinkedList

    C++模拟实现JDK中的ArrayList和LinkedList 介绍 在Java语言中,ArrayList和LinkedList是两种常见的List集合实现方式。ArrayList底层基于动态数组实现,适用于随机访问元素,但插入和删除操作效率较低。LinkedList底层基于双向链表实现,适用于频繁插入和删除操作,但访问元素效率较低。 本篇文章将介绍如何使…

    其他 2023年3月28日
    00
  • 分享Python 加速运行技巧

    分享Python 加速运行技巧攻略 Python 是一种解释型语言,相对于编译型语言来说,其执行速度可能较慢。然而,有许多技巧可以帮助加速 Python 程序的运行。本攻略将介绍一些常用的 Python 加速运行技巧,并提供两个示例说明。 1. 使用适当的数据结构 选择适当的数据结构可以显著提高 Python 程序的性能。以下是一些常见的数据结构和其适用场景…

    other 2023年7月29日
    00
  • 获取根目录的URL例如http://localhost:51898

    获取根目录的URL可以通过以下两种方式实现: 使用ASP.NET Core中的IHttpContextAccessor 在ASP.NET Core应用中,我们可以通过在Startup.Configure方法中注入IHttpContextAccessor服务,然后调用HttpContext.Request获取当前请求的信息。通过Request对象可以获取到当前…

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