大文件分割,合并------C++ ------fstream

将一个大文件(这里测试文件为5.2G)切分为指定大小的文件,然后在把分割后的文件拼接合并为分割前的源文件

#include <boost/timer.hpp> // 计时函数#include <filesystem>
#include <fstream>
#include <vector>
// 分隔后文件夹的格式, 原文件名_chunk
#define FILE_SUFFIX "_chunk"
// 生成每个小块文件的名称格式, 源文件名_chunk_1.bin
#define CHUNK_NAME "%s_chunk_%d.bin"/// <summary>
/// 分隔文件函数,将一个文件按照规定的大小分割为多个小块
/// </summary>
/// <param name="inputFile">被分割的文件</param>
/// <param name="chunkSize">分割后每块文件的大小(单位字节): 如果要分割为500mb每块,该数值为 500 * 1024 * 1024 </param>
/// <param name="inputFiles">切分后后的所有文件名</param>
/// <returns></returns>
bool splitFile(const std::string& inputFile, size_t chunkSize, std::vector<std::string>& inputFiles)
{std::string inputFileName = std::filesystem::path(inputFile).filename().stem().string();std::string dirname = inputFileName + FILE_SUFFIX;std::filesystem::path chunkDir = std::filesystem::path(inputFile).parent_path();chunkDir.append(dirname);if (!std::filesystem::exists(chunkDir)){std::filesystem::create_directories(chunkDir);}std::ifstream inputFileStream(inputFile, std::ios::binary | std::ios::ate);if (!inputFileStream.is_open()) {std::cout << "Error opening file: " << inputFile << std::endl;return false;}size_t fileSize = static_cast<size_t>(inputFileStream.tellg());inputFileStream.seekg(0, std::ios::beg);//如果文件大小小于size_t numberOfChunks = (fileSize + chunkSize - 1) / chunkSize;for (size_t i = 0; i < numberOfChunks; ++i) {size_t chunkOffset = i * chunkSize;size_t chunkSizeActual = std::min(chunkSize, fileSize - chunkOffset);//std::vector<char> buffer(chunkSizeActual);char buff[256];sprintf(buff, "%s_chunk_%d.bin", inputFileName.c_str(), static_cast<int>(i));std::filesystem::path tempChunkDir = chunkDir;std::string chunkFileName = tempChunkDir.append(buff).string();inputFiles.push_back(chunkFileName);char* buffer = new char[chunkSizeActual];// 移动文件读取指针到当前块的起始位置inputFileStream.seekg(chunkOffset, std::ios::beg);inputFileStream.read(buffer, chunkSizeActual);std::ofstream chunkFile(chunkFileName, std::ios::binary);if (!chunkFile.is_open()) {std::cout << "Error creating chunk file: " << chunkFileName << std::endl;delete[] buffer;return false;}chunkFile.write(buffer, chunkSizeActual);chunkFile.close();delete[] buffer;std::cout << "save split: " << chunkFileName << std::endl;}inputFileStream.close();return true;
}/// <summary>
/// 将多个文件合并为一个文件
/// </summary>
/// <param name="outputFileName">合并后的文件</param>
/// <param name="inputFiles">需要合并的小文件</param>
/// <returns></returns>
bool mergeFiles(const std::string& outputFileName, const std::vector<std::string>& inputFiles) 
{std::ofstream outputFile(outputFileName, std::ios::binary);if (!outputFile.is_open()) {std::cout << "Error creating output file: " << outputFileName << std::endl;return false;}for (const auto& inputFile : inputFiles) {std::ifstream inputFileStream(inputFile, std::ios::binary);if (!inputFileStream.is_open()) {std::cout << "Error opening input file: " << inputFile << std::endl;return false;}outputFile << inputFileStream.rdbuf();inputFileStream.close();std::cout << "merge: " << inputFile << std::endl;}outputFile.close();return true;
}int main() {std::string inputFile = "./split_file.rar";   // 这里测试文件大小为5.2Gstd::string mergedFileName = "./merged_file.rar";size_t chunkSize = 500 * 1024 * 1024;  // 500 MBboost::timer tm1; // 定义后计时开始tm1.restart();  // 从新从这里开始计时std::vector<std::string> inputFiles;bool sp = splitFile(inputFile, chunkSize, inputFiles);if (sp){std::cout << "splitFile successed" << std::endl;}else{std::cout << "splitFile failed" << std::endl;}std::cout << tm1.elapsed() << std::endl;  // 单位是秒tm1.restart();  // 从新从这里开始计时bool me = mergeFiles(mergedFileName, inputFiles);if (me){std::cout << "mergeFiles successed" << std::endl;}else{std::cout << "mergeFiles failed" << std::endl;}std::cout << tm1.elapsed() << std::endl;  // 单位是秒return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索开源游戏的乐趣与无限可能 | 开源专题 No.47

CleverRaven/Cataclysm-DDA Stars: 9.0k License: NOASSERTION Cataclysm&#xff1a;Dark Days Ahead 是一个回合制的生存游戏&#xff0c;设定在一个后启示录世界中。尽管有些人将其描述为 “僵尸游戏”&#xff0c;但 Cataclysm 远不止于此。在这个残酷、持久、程序生成的世…

【原创】【一类问题的通法】【真题+李6卷6+李4卷4(+李6卷5)分析】合同矩阵A B有PTAP=B,求可逆阵P的策略

【铺垫】二次型做的变换与相应二次型矩阵的对应&#xff1a;二次型f&#xff08;x1&#xff0c;x2&#xff0c;x3&#xff09;xTAx&#xff0c;g&#xff08;y1&#xff0c;y2&#xff0c;y3&#xff09;yTBy ①若f在可逆变换xPy下化为g&#xff0c;即P为可逆阵&#xff0c;有P…

Unity 通过键盘鼠标控制物体移动、旋转、缩放的方法

在Unity中&#xff0c;使用键盘ADWS键控制物体移动&#xff0c;通过鼠标左键控制物体旋转&#xff0c;鼠标中键控制物体缩放是再常见不过的方法。 方法如下&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class MoveCo…

数字系统设计(EDA)实验报告【出租车计价器】

一、问题描述 题目九&#xff1a;出租车计价器设计&#xff08;平台实现&#xff09;★★ 完成简易出租车计价器设计&#xff0c;选做停车等待计价功能。 1、基本功能&#xff1a; &#xff08;1&#xff09;起步8元/3km&#xff0c;此后2元/km&#xff1b; &#xff08;2…

红队攻防实战之ThinkPHP-RCE集锦

你若不勇敢&#xff0c;谁又可以替你坚强&#xff1f; ThinkPHP 2.x RCE漏洞 1、查询phpinfo() 2、任意代码执行 3、Getshell 蚁剑连接&#xff1a; ThinkPHP5 5.0.23 RCE漏洞 发送数据包&#xff1a; 成功执行id命令&#xff1a; 工具验证 ThinkPHP5 SQL注入漏洞 &&am…

什么是神经网络的非线性

大家好啊&#xff0c;我是董董灿。 最近在写《计算机视觉入门与调优》&#xff08;右键&#xff0c;在新窗口中打开链接&#xff09;的小册&#xff0c;其中一部分说到激活函数的时候&#xff0c;谈到了神经网络的非线性问题。 今天就一起来看看&#xff0c;为什么神经网络需…

cuda函数的前缀作用

文章目录 cuda函数的前缀作用1、前缀作用2、global3、device4、host cuda函数的前缀作用 1、前缀作用 函数执行环境标识符&#xff0c;即表明函数在哪里被调用 2、global __global__修饰的函数是核函数&#xff0c;这些函数在GPU上执行&#xff0c;但是需要在CPU上调用。 g…

激光打标机在智能手表上的应用:科技与时尚的完美结合

随着科技的飞速发展&#xff0c;智能手表已经成为我们日常生活中不可或缺的智能设备。而在智能手表制造中&#xff0c;激光打标机扮演着至关重要的角色。本文将详细介绍激光打标机在智能手表制造中的应用&#xff0c;以及其带来的优势和影响。 ​ 一、激光打标机在智能手表制…

按订单周期结算的产品成本

原文地址&#xff1a;Product Cost By Order Cycle | SAP Blogs 产品成本核算是每个制造企业的控制部门的核心职责之一&#xff0c;根据其产品和生产的性质&#xff0c;每个企业的成本核算有所不同。它支持组织在其他职能领域做出大量战略决策。在过去几年中获得了 SAP 产品成本…

Vite4、Vue3、Axios 针对请求模块化封装搭配自动化导入(简单易用)

针对请求模块化封装搭配自动化导入&#xff08;简单易用&#xff09; 目标目录目标代码前提步入正题src / utils / index.jssrc /api / index.jssrc /api / request.jssrc /api / service.jssrc /api / utils.jssrc /api / modules / demo.js 自动化配置vite.config.jseslint 校…

QEMU环境调试方法

本文从调试的角度出发&#xff0c;分享QEMU调试过程中的常见调试方法。 1.如何查看makefile构建过程执行的命令&#xff1f; 为了深入理解ucore操作系统实验的编译链接细节&#xff0c;需要知道makefile在执行的过程中一步一步的指令执行情况。然而大部分的工程中&#xff0c;…

CopyClip 2:提升Mac开发效率的利器

在Mac开发的日常工作中&#xff0c;高效地处理剪贴板内容是一个至关重要的任务。幸运的是&#xff0c;有一款强大的工具可以极大地提升你的开发效率——CopyClip 2。本文将介绍CopyClip 2的功能和优势&#xff0c;以及它是如何成为Mac开发者们不可或缺的利器的。 CopyClip 2 简…

【Docker】进阶之路:(二)Docker简介

【Docker】进阶之路&#xff1a;&#xff08;二&#xff09;Docker简介 什么是 DockerDocker 由来与发展历程Docker的架构与组成Docker容器生态容器核心技术容器规范容器平台技术 为什么使用DockerDocker的应用场景 什么是 Docker 简单地讲&#xff0c;Docker就是一个应用容器…

正则表达式(9):扩展正则表达式

正则表达式&#xff08;9&#xff09;&#xff1a;扩展正则表达式 小结 本博文转载自 前文中一直在说&#xff0c;在Linux中&#xff0c;正则表达式可以分为”基本正则表达式”和”扩展正则表达式”。 我们已经认识了”基本正则表达式”&#xff0c;现在&#xff0c;我们来认…

T天池SQL训练营(五)-窗口函数等

–天池龙珠计划SQL训练营 5.1窗口函数 5.1.1窗口函数概念及基本的使用方法 窗口函数也称为OLAP函数。OLAP 是OnLine AnalyticalProcessing 的简称&#xff0c;意思是对数据库数据进行实时分析处理。 为了便于理解&#xff0c;称之为窗口函数。常规的SELECT语句都是对整张表进…

Unity由“鼠标点不准物体”引发的Camera的相关思考

问题 前段一个同事在使用Unity开发时遇到一个奇怪的问题&#xff0c;使用左键点击发射射线的方式选择物体&#xff0c;总是选不准&#xff0c;尤其是小的物体&#xff0c;鼠标点击到物体上&#xff0c;有时能选上&#xff0c;有时选不上&#xff0c;偶尔点击到物体旁边…

Tensorflow.js 入门学习指南

Tensorflow.js 入门学习指南 官方地址TensorFlow.js (google.cn) Tensorflowjs是一个机器学习框架&#xff0c;使用 TensorFlowJS 可以创建生产级机器学习模型 安装包 浏览器设置 您可以通过两种主要方式在浏览器项目中获取 TensorFlow.js&#xff1a; 使用脚本代码。从 NPM…

基于MATLAB车辆防碰撞系统仿真

摘要 近年来&#xff0c;汽车行业的飞速发展使得我国的汽车保有量快速增长&#xff0c;但由此引发的交通事故导致的人员伤亡数量仍居高不下。从保护人身安全和降低交通事故发生的可能性的角度出发&#xff0c;车辆防碰撞系统能够使驾驶员在没注意到与前方车辆有碰撞危险的情况下…

Python:核心知识点整理大全11-笔记

目录 ​编辑 6.2.4 修改字典中的值 6.2.5 删除键—值对 注意 删除的键—值对永远消失了。 6.2.6 由类似对象组成的字典 6.3 遍历字典 6.3.1 遍历所有的键—值对 6.3.2 遍历字典中的所有键 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端 目 录 1、产品规格 2、接口使用 2.1、侧面接口功能 2.2、背面接口功能 2.3、面板接口功能 3、功能使用 1、产品规格 输入电源&#xff1a; 12V&#xff5e;24V的直流电源 网络接口&am…