分割/合并文件

一个音频/视频太大,以下代码就能将其分割成多个模块,分模块传输,解决文件过大,传输不了的问题

分割文件

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void main()
{
	char path[100] = "C:\\Users\\Charging\\Desktop"; //文件路径
	char filename[50] = "111.mp3";   //文件名
	char lastpath[150];   //存储文件的路径
	sprintf(lastpath, "%s\\%s", path, filename);  //构建文件的路径 将上面两个合并

	int filesize = 0;  //获取文件大小
	FILE *fp = fopen(lastpath, "rb"); //以二进制方式打开
	if (fp == NULL)
	{
		perror("合并失败的原因");
		return;
	}
    fseek(fp, 0, SEEK_END);
	filesize = ftell(fp);   //将指针移到末尾来回去指针大小
	printf("文件有%d个字节\n", filesize);

	int setsize = 2 * 1024 * 1024;//单位模块 1024 * 1024=1M ,具体几M 看文件大小
	int N;  //存储一个文件最多可以分割成多少模块

	if (filesize % setsize == 0)
	{
		N = filesize / setsize;
	}
	else
	{
		N = filesize / setsize + 1;   
	}
    printf("N的个数是%d,setsize的大小是%d,filesize的大小是%d\n", N,    setsize, filesize);
	fseek(fp, 0, SEEK_SET);   //指针移到开头,由于统计大小,被移到末尾
	char listpath[100] = "C:\\Users\\Charging\\Desktop\\list.txt";   //分割的小文件,用于存储被分割的
	
	FILE *plist = fopen(listpath, "w");   //在定义指针,处理每个小模块
	for (int i = 1;i <= N;i++)
	{
		char temppath[120];
		sprintf(temppath, "%s\\%d%s", path, i, filename);  //构建每个文件名
		printf("%s\n", temppath);
		fputs(temppath, plist);    //将每个模块路径写入但模块指针
		fputc('\n', plist);    //写入换行符
		FILE *po = fopen(temppath, "wb");   //按照二进制写入模式打开
		if (i < N)  //处理前面刚好被分割完的
		{
			for (int j = 0; j < setsize; j++)
			{
				char ich = fgetc(fp);  //从原文件中读取字符放入
				fputc(ich, po);   //将上面读取的字符写到被分割好的临时文件中
			}
		}
        else    //处理最后一块多余的
		{
			for (int j = 0; j < filesize - (N - 1)*setsize; j++)
			{
				int ich = fgetc(fp);
				fputc(ich, po);
			}
		}		
        fclose(po);   //关闭写入的块文件
	}
	fclose(plist);
	fclose(fp);  //关闭源文件
	system("pause");
}

合并文件(基于分割完文件的基础上)

void main()
{
	char path[100] = "C:\\Users\\Charging\\Desktop\\list.txt";
	FILE *fp = fopen(path, "r");
	char finapath[100] = "C:\\Users\\Charging\\Desktop\\合并昼颜.mp3";
	FILE *fpfina = fopen(finapath, "wb");
	char temppath[200];
	while (fgets(temppath, 200, fp))  //循环遍历list.txt中的被分割的路径
	{
		printf("%s", temppath);  //字符串有换行符
		int len = strlen(temppath);
		temppath[len - 1] = '\0';   //换行符i换成‘\0’
		{
			FILE *fpb = fopen(temppath, "rb");
			int ich = fgetc(fpb);
			while (!feof(fpb))
			{
				fputc(ich, fpfina);//写入要合并的文件
				ich = fgetc(fpb);
			}
			fclose(fpb);
		}
	}
	fclose(fpfina);
	fclose(fp);
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值