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) = '\0';
	return name;
}

文件切割

int FileCutting(){
    
    
	FILE *fpr; /*读文件指针*/
	FILE *fpw; /*写文件指针*/
	FILE *fplist; /**/
	char file_name[20];
	int file_id; /*新文件名id,001,002*/
	int n = 0;


	long offset; /*文件指针位置*/
	long fsize;  /*文件大小*/

	long fblock = 0; /* 1 M */
	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); /* demo.001 */
	
	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); /* demo.00x */	
			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]='\0';
		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; /*新文件名id,001,002*/


	long offset; /*文件指针位置*/
	long fsize;  /*文件大小*/

	long fblock = 0; /* 1 M */
	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); /* demo.001 */
	
	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); /* demo.00x */	
			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]='\0';
		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

猜你喜欢

转载自blog.csdn.net/qq_43802454/article/details/121387099