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