用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日

相关文章

  • mysql实现向某个字段前或后添加字符

    要向 MySQL 表格中的某个字段前或后添加字符,可以使用 MySQL 中的字符串函数来实现。下面是基本步骤及示例说明: 使用 ALTER TABLE 语句来在表格中添加新列(这一步是可选的,如果已经有需要修改的列则可以跳过此步骤)。 ALTER TABLE `table_name` ADD COLUMN `new_column_name` VARCHAR(…

    other 2023年6月25日
    00
  • java-gcm规范id

    以下是关于“Java GCM规范ID”的完整攻略,包括定义、使用方法、示例说明和注意事项。 定义 Java GCM规范ID是指Google Cloud Messaging(G)服务中用于标识应用程序的唯一标识符。Java GCM规范ID是一个字符串,由Google Developers Console分配给每个应程序。Java GCM规范ID用于在GCM服务…

    other 2023年5月8日
    00
  • Mac系统怎么更改文件扩展名?

    当你想要更改Mac系统中文件的扩展名时,可以按照以下步骤进行操作: 首先,找到你想要更改扩展名的文件。可以通过Finder或者桌面上的图标来找到文件。 选中文件,然后按下\”回车\”键或者右键点击文件,选择\”重命名\”选项。 文件名会被选中,此时按下\”Tab\”键,你会看到文件名和扩展名被分开选中。 输入你想要的新的扩展名。确保扩展名是正确的,例如\”.…

    other 2023年8月5日
    00
  • jwt——生成token、解析token的简单工具类

    以下是关于“JWT——生成Token、解析Token的简单工具类”的完整攻略,过程中包含两个示例。 背景 在Web开发中,JWT(JSON Web Token)是一种常用身份验证和授权机制。攻略将介绍如何使用Java编写一个简单的JWT工具类,用于生成Token和解析Token。 基本原理 在Java,我们可以使用第三方库jjwt来生成和解析JWT。具体步骤…

    other 2023年5月9日
    00
  • html5 video标签屏蔽右键视频另存为的js代码

    要实现html5 video标签屏蔽右键视频另存为,我们可以使用Javascript代码来解决。具体的实现过程如下: 1. 创建一个video标签 首先,我们需要在HTML中创建一个video标签,并指定要加载的视频文件路径。 <video id="myVideo" controls preload="metadata&q…

    other 2023年6月27日
    00
  • Windows下使用命令实现文件换行符替换

    当使用不同操作系统或编辑器时,文件的换行符可能会不同。在Windows操作系统下,文件的换行符通常是”\r\n”,而在Unix/Linux系统和macOS中则是”\n”。因此,在进行不同系统之间的文件传输或处理时,可能需要进行换行符的转换。 以下是在Windows下使用命令实现文件换行符替换的完整攻略: 1. 使用Notepad++软件替换文件中的换行符 N…

    other 2023年6月26日
    00
  • vs2010打包安装包带数据库

    VS2010打包安装包带数据库 在软件开发过程中,经常需要将开发完成的程序打包成安装包进行发布。为了方便用户的安装,可以将程序的依赖项也打包进去,比如数据库。本文将介绍如何使用VS2010打包安装包并将数据库一起打包。 准备工作 在开始之前,需要安装VS2010和SQL Server 2008 R2(假设你的程序是基于该版本的数据库开发的)。同时,需要确保你…

    其他 2023年3月28日
    00
  • c/c++之qt正则表达式

    c/c++之Qt正则表达式 在c/c++程序开发中,正则表达式是一个十分重要的应用技巧。Qt作为一款友好的GUI开发框架,它内置的正则表达式模块提供了一些非常方便的功能。 正则表达式的定义和作用 正则表达式是描述字符串集合的一个公式。它使我们对字符串进行匹配、查找和替换等操作更加灵活和高效。正则表达式可以用于验证输入的格式是否正确,或者从大量文本中提取数据。…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部