栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言版文件操作-切割和合并

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言版文件操作-切割和合并

思路 切割

读取文件,按输入大小进行切割,截取文件名做为切割文件名,并把切割的各个文件名存到./data/filelist.txt中

合并

读取./data/filelist.txt中的分割文件名,循环读取文件,并写进新的文件中。

流程图

代码 菜单
void DispalyMenu(){
	printf("==============请选择功能==============n");
	printf("=               1.切割               =n");
	printf("=               2.合并               =n");
	printf("=               3.退出               =n");
	printf("======================================n");
	return;
}
主函数
int main(int argc,char* argv[])
{
	char option;
	DispalyMenu();
	scanf("%c",&option);
	while(1){
		switch(option){
			case '1': FileCutting();break;
			case '2': FileMerge();break;
			case '3': exit(0);
			default: exit(0);
		}
		DispalyMenu();
		getchar();
		scanf("%c",&option);
	}
	return 0;
}
字符串切割

传入传字符,以"."为条件结束,最后只返回文件名。

char * NameSqlit(char *filename){
	char *name;
	int n = strlen(filename);
	int i = 0;
	name = (char *)malloc(n-4);
	while(*(filename+i) != '.'){
			*(name+i) = *(filename+i);
			i++;
	}
	*(name+i) = '';
	return name;
}
文件切割
int FileCutting(){
	FILE *fpr; 
	FILE *fpw; 
	FILE *fplist; 
	char file_name[20];
	int file_id; 
	int n = 0;


	long offset; 
	long fsize;  

	long fblock = 0; 
	char data;
	unsigned int size_r;

	printf("请输入文件名n");
	scanf("%s",file_name);
	printf("请输入切割大小(输入50则拆分50K一份)n");
	scanf("%d",&n);
	//printf("%s",NameSqlit(file_name));
	if(NameSqlit(file_name) == "" || n == 0){
		printf("输入有误,程序退出n");
		return 0;
	}

	fblock = 1024 * n;

	fpr = fopen(file_name,"rb");

	if(!fpr)
	{
		printf("文件打开失败!n");
		return 0;
	}

	offset = 0;
	fseek(fpr,0,SEEK_END);
	fsize = ftell(fpr);
	fseek(fpr,0,SEEK_SET); 

	size_r = fread(&data,sizeof(char),1,fpr);

	file_id = 1;
	sprintf(file_name,"%s.%03d",NameSqlit(file_name),file_id); 
	
	fpw = fopen(file_name,"wb"); 
	fplist = fopen("./data/filelist.txt","w");
	while(size_r>0)
	{
		
		fwrite(&data,sizeof(char),1,fpw);
		offset = ftell(fpr);
		if(offset % fblock == 0)
		{
			
			fclose(fpw);
			fputs(file_name,fplist);
			fputs("n",fplist);
			file_id++;
			sprintf(file_name,"%s.%03d",NameSqlit(file_name),file_id); 	
			fpw = fopen(file_name,"wb"); 
		}
		size_r = fread(&data,sizeof(char),1,fpr);
	}
	if(fpw)
	{
		fputs(file_name,fplist);
		fputs("n",fplist);
		fclose(fpw);
	}
	fclose(fplist);
	fclose(fpr);


	printf("文件切割完成n");
	return 0;
}
文件合并
int FileMerge(){

	FILE *fpr;
	FILE *fpw;
	FILE *fplist;

	char file_name[20],filename[20];
	int file_id,i;
	
	char data;
	unsigned int size_r;
	char name[20];
	printf("请输入要合成的文件(格式ceshi.txt):n");
	scanf("%s",filename);
	
	fpw = fopen(filename,"wb");
	if(!fpw)
	{
		printf("文件创建失败!n");
		return 0;
	}
	fplist = fopen("./data/filelist.txt","r");
	//fgets(file_name,20,fplist);

	while(fgets(file_name,20,fplist) != NULL)
	{	
		file_name[strlen(file_name)-1]='';
		fpr = fopen(file_name,"rb");
		if(!fpr)
		{
			printf("打开文件%s失败n",file_name);
			return 0;
		}
		
		size_r = fread(&data,sizeof(char),1,fpr);
		while(size_r>0)
		{
			fwrite(&data,sizeof(char),1,fpw);
			size_r = fread(&data,sizeof(char),1,fpr);
		}
		fclose(fpr);		
		//fgets(file_name,20,fplist);

	}
	fclose(fpw);
	printf("文件合并完成n");
	return 0;

}
使用命令传参版
int FileCutting(char *file_name,long n){
	FILE *fpr; 
	FILE *fpw; 
	FILE *fplist; 
	//char file_name[20];
	int file_id; 


	long offset; 
	long fsize;  

	long fblock = 0; 
	char data;
	unsigned int size_r;

	//printf("请输入文件名n");
	//scanf("%s",file_name);
	//printf("请输入切割大小(输入50则拆分50K一份)n");
	//scanf("%d",&n);
	//printf("%s",NameSqlit(file_name));
	if(NameSqlit(file_name) == 0 || n == 0){
		printf("输入有误,程序退出n");
		return 0;
	}

	fblock = 1024 * n;

	fpr = fopen(file_name,"rb");

	if(!fpr)
	{
		printf("文件打开失败!n");
		return 0;
	}

	offset = 0;
	fseek(fpr,0,SEEK_END);
	fsize = ftell(fpr);
	fseek(fpr,0,SEEK_SET); 

	size_r = fread(&data,sizeof(char),1,fpr);

	file_id = 1;
	sprintf(file_name,"%s.%03d",NameSqlit(file_name),file_id); 
	
	fpw = fopen(file_name,"wb"); 
	fplist = fopen("./data/filelist.txt","w");
	while(size_r>0)
	{
		
		fwrite(&data,sizeof(char),1,fpw);
		offset = ftell(fpr);
		if(offset % fblock == 0)
		{
			
			fclose(fpw);
			fputs(file_name,fplist);
			fputs("n",fplist);
			file_id++;
			sprintf(file_name,"%s.%03d",NameSqlit(file_name),file_id); 	
			fpw = fopen(file_name,"wb"); 
		}
		size_r = fread(&data,sizeof(char),1,fpr);
	}
	if(fpw)
	{
		fputs(file_name,fplist);
		fputs("n",fplist);
		fclose(fpw);
	}
	fclose(fplist);
	fclose(fpr);


	printf("文件切割完成n");
	return 0;
}


int FileMerge(char *filename){

	FILE *fpr;
	FILE *fpw;
	FILE *fplist;

	char file_name[20];
	//char filename[20];
	int file_id,i;
	
	char data;
	unsigned int size_r;
	char name[20];
	fpw = fopen(filename,"wb");
	if(!fpw)
	{
		printf("文件创建失败!n");
		return 0;
	}
	fplist = fopen("./data/filelist.txt","r");

	while(fgets(file_name,20,fplist) != NULL)
	{	
		file_name[strlen(file_name)-1]='';
		fpr = fopen(file_name,"rb");
		if(!fpr)
		{
			printf("打开文件%s失败n",file_name);
			return 0;
		}
		
		size_r = fread(&data,sizeof(char),1,fpr);
		while(size_r>0)
		{
			fwrite(&data,sizeof(char),1,fpw);
			size_r = fread(&data,sizeof(char),1,fpr);
		}
		fclose(fpr);		

	}
	fclose(fpw);
	printf("文件合并完成n");
	return 0;

}

void DispalyMenu(){
	printf("请输入正确的命令格式如下:n");
	printf("main.exe -t s 分割文件 单个文件大小n");
	printf("main.exe -t m 合并后的文件名称n");
	return;
}


int main(int argc,char* argv[])
{
	if(strcmp("s",argv[2]) == 0){
		if(argc < 5){
			DispalyMenu();
			return 0;
		}
	   printf("正在切割文件请稍后...n");
	   FileCutting(argv[3],strtol(argv[4],NULL,10));
	}else if(strcmp("m",argv[2]) == 0){
		if(argc < 4){
			DispalyMenu();
			return 0;
		}
		printf("正在合并文件请稍后...n");
		FileMerge(argv[3]);
	}else{
		DispalyMenu();
		return 0;
	}
}
效果图


代码地址

Github:https://github.com/Ltike/Learning/tree/main

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/528785.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号