如何用C语言合并二进制文件分片?(Curl多段下载场景)
合并二进制分片文件的C语言实现
关于fwrite参数的说明
你在Curl回调里的fwrite(ptr, sz, nmemb, stream)写法完全正确。这里sz是单个数据块的字节大小,nmemb是块的数量,fwrite会把sz*nmemb字节的二进制数据原样写入文件,不会对内容做任何修改,完全适配视频、ISO这类二进制文件的分片写入需求。
合并分片的具体实现
要将filepath1.x、filepath2.x、filepath3.x合并为output.mp4,核心逻辑是按顺序以二进制模式读取每个分片,将内容原样写入输出文件,代码示例如下:
#include <stdio.h> #include <stdlib.h> #define BUFFER_SIZE 4096 // 缓冲区大小可根据内存情况调整 int main() { // 按分片的正确顺序定义路径列表 const char* chunk_files[] = {"filepath1.x", "filepath2.x", "filepath3.x"}; int chunk_count = sizeof(chunk_files) / sizeof(chunk_files[0]); // 打开输出文件,二进制写入模式(wb会覆盖已有文件,确保从头开始写入) FILE* output = fopen("output.mp4", "wb"); if (!output) { perror("Failed to open output file"); return EXIT_FAILURE; } char buffer[BUFFER_SIZE]; size_t bytes_read; // 逐个处理分片文件 for (int i = 0; i < chunk_count; i++) { FILE* chunk = fopen(chunk_files[i], "rb"); if (!chunk) { perror(chunk_files[i]); fclose(output); return EXIT_FAILURE; } // 循环读取分片内容,写入输出文件 while ((bytes_read = fread(buffer, 1, BUFFER_SIZE, chunk)) > 0) { if (fwrite(buffer, 1, bytes_read, output) != bytes_read) { perror("Failed to write to output file"); fclose(chunk); fclose(output); return EXIT_FAILURE; } } // 检查分片读取是否出现错误 if (ferror(chunk)) { perror(chunk_files[i]); fclose(chunk); fclose(output); return EXIT_FAILURE; } fclose(chunk); } fclose(output); printf("合并完成!\n"); return EXIT_SUCCESS; }
关键注意事项
- 强制使用二进制模式:打开文件时必须用
rb(读分片)和wb(写输出),避免文本模式下系统自动转换换行符(比如Windows下的\r\n转\n),导致二进制文件结构损坏。 - 严格按顺序合并:Range请求的分片是按原文件字节范围拆分的,必须严格遵循下载时的顺序合并,否则最终文件会因内容乱序而无法正常使用。
- 错误检查不可少:代码中加入了文件打开、读写的错误判断,能及时发现并反馈问题,避免生成损坏的输出文件却未被察觉。
内容的提问来源于stack exchange,提问作者amateur
相关产品推荐
相关产品推荐

