You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中复制二进制文件的部分内容到新文件?

如何实现二进制文件的部分内容复制?

看起来你已经搞定了二进制文件的全量复制,但现在需要实现部分内容的复制对吧?其实核心就是定位输入流的起始位置,再控制复制的字节数——毕竟原来的copy会一直读到文件尾,咱们得给它加个限制。下面我给你分几种常见场景来实现:

场景1:从指定偏移位置开始复制N个字节

比如你想从文件的第100个字节(0-based,也就是文件开头后第100个字节)开始,复制500个字节到目标文件,可以用seekg()定位起始位置,再用copy_n()(C++11及以上支持)来控制复制的字节数:

#include <fstream>
#include <iterator>
#include <string>
#include <iostream>

void copyPartialBinaryFile(const std::string& file, std::streampos startOffset, std::streamsize bytesToCopy) {
    std::ifstream input(file.c_str(), std::ios::binary);
    std::ofstream output("/home/my_name/result.img", std::ios::binary);

    // 先检查文件是否成功打开
    if (!input.is_open() || !output.is_open()) {
        std::cerr << "Failed to open source or destination file!" << std::endl;
        return;
    }

    // 获取文件总大小,用于合法性检查
    input.seekg(0, std::ios::end);
    std::streampos fileSize = input.tellg();
    input.seekg(0, std::ios::beg);

    // 检查起始偏移是否合法
    if (startOffset >= fileSize) {
        std::cerr << "Start offset exceeds total file size!" << std::endl;
        return;
    }

    // 调整要复制的字节数,避免超过剩余可用字节
    if (startOffset + bytesToCopy > fileSize) {
        bytesToCopy = fileSize - startOffset;
        std::cerr << "Requested bytes exceed remaining data, copying only " << bytesToCopy << " bytes instead." << std::endl;
    }

    // 定位到目标起始位置
    input.seekg(startOffset);
    if (input.fail()) {
        std::cerr << "Failed to seek to the specified start offset!" << std::endl;
        return;
    }

    // 复制指定字节数
    std::copy_n(std::istreambuf_iterator<char>(input), bytesToCopy, std::ostreambuf_iterator<char>(output));
}

调用示例:

// 从文件第100字节开始,复制500字节
copyPartialBinaryFile("your_source_file.bin", 100, 500);

场景2:复制文件开头到指定偏移位置

如果只需要复制文件的前N个字节,或者复制到某个偏移位置结束,代码可以简化成这样:

#include <fstream>
#include <iterator>
#include <string>
#include <iostream>

void copyBinaryFileUpToOffset(const std::string& file, std::streampos endOffset) {
    std::ifstream input(file.c_str(), std::ios::binary);
    std::ofstream output("/home/my_name/result.img", std::ios::binary);

    if (!input.is_open() || !output.is_open()) {
        std::cerr << "File open error!" << std::endl;
        return;
    }

    input.seekg(0, std::ios::end);
    std::streampos fileSize = input.tellg();
    input.seekg(0, std::ios::beg);

    // 确保结束偏移不超过文件大小
    if (endOffset > fileSize) {
        endOffset = fileSize;
        std::cerr << "End offset exceeds file size, copying entire file instead." << std::endl;
    }

    std::copy_n(std::istreambuf_iterator<char>(input), endOffset, std::ostreambuf_iterator<char>(output));
}

调用示例:

// 复制前800个字节
copyBinaryFileUpToOffset("your_source_file.bin", 800);

额外小提示

  • streampos和streamsize都是C++标准库中用于文件定位和字节计数的类型,比直接用int更安全,能适配不同系统的文件大小限制。
  • 一定要加错误处理,比如文件打开失败、偏移无效的情况,避免程序崩溃或者生成损坏的文件。

内容的提问来源于stack exchange,提问作者MMMMMCK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:21:51