⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packer.cpp

📁 这是我用C语言写的一个很好的打包程序
💻 CPP
字号:
// 	专业:软件工程		班级:073			
//	姓名:	方郁		学号:2007081305
//	设计完成日期:2008.11.12
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
void main()
{
	int ch,i=1,flag=1;
	long length;
	FILE *minbag,*maxbag;               //文件指针
	char filename[20],answer[1],*temp;
	struct Fhead                     //用来记录文件的名字和长度
	{
		char fname[20];        // 文件名
		long flength;             //文件长度
	}FH;
	while(flag)
	{
		printf("\n\n\t\t=================================\n");                //显示主菜单
		printf("\t\t=====\t 1.打包文件\t=========\n");
		printf("\t\t=====\t 2.浏览文件\t=========\n");
		printf("\t\t=====\t 3.解压文件\t=========\n");
		printf("\t\t=====\t 0.退出    \t=========\n"); 
		printf("\t\t=================================\n\n");
		printf("\t\t请选择:  ");
		scanf("%d",&ch);           //输入选择变量
		switch(ch)
		{
		case 1:
			{   
				printf("\n\t\t输入文件名: ");
				scanf("%s",filename);
				if((maxbag=fopen(filename,"wb+"))==NULL)             //为输出打开一个文件
				{
					printf("\n\t\tcannot open file\n");           
					exit(0);        // 打开出错则退出
				}
				do
				{
					printf("\n\t\t输入要打包的小文件名: ");
					scanf("%s",FH.fname);                  //输入打包文件名
					if((minbag=fopen(FH.fname,"rb"))==NULL)       // 为输入打开一个文件
					{
						printf("\n\t\tcannot open file\n");
						exit(0);
					}
					fseek(minbag,0,2);           //使文件读写指针置尾
					FH.flength=ftell(minbag);        //读文件长度并赋给 FH.flength
					length=FH.flength;                
					
					rewind(minbag);                  //使文件读写指针置于文件头
					fwrite(&FH,sizeof(struct Fhead),1,maxbag);  // 把记有文件名字与长度的结点读入打包文件
					temp = (char *)malloc(1024);  // 在内存中申请一段存储空间
					while(length)
					{
						
						if(length>1024)       
						{
							fread(temp,1024,1,minbag);   //从小文件中读取1024个字节到内存中
							fwrite(temp,1024,1,maxbag);  //把读取到内存中的信息输出到打包文件中
							length=length-1024;          //每读完一次length减小1024个字节
						}
						else
						{
                            fread(temp,length,1,minbag); //把length长度的信息读到内存中
							fwrite(temp,length,1,maxbag);//把读取到内存中的信息输出到打包文件中
							length=0;  //读完length置零,结束循环
						}
						
					}
					printf("\n\t\t打包成功\n");
					fclose(minbag);           //关闭文件
					free(temp); // 释放内存
					printf("\n\t\t是否继续打包(Y/N): ");
					getchar();
					answer[0]=getchar();
				}
				while(answer[0]=='y'||answer[0]=='Y');       //如果回答Y或y则循环,继续打包
				
				fclose(maxbag); //关闭文件
				
				break;
			}
		case 2:
			{
				printf("\n\t\t输入打包文件名: ");
				scanf("%s",filename);         //输入要浏览的文件名
				if ((maxbag=fopen(filename,"rb"))==NULL)// 为读入而打开一个文件
					
				{
					printf("\n\t\tcannot open file");
					exit(0);
				}
				fread(&FH,sizeof(struct Fhead),1, maxbag); //从打包文件中读取小文件的结点中的数据信息
				while(!feof(maxbag))          // 当打包文件还未结束时循环
				{
					
					printf("\n\t第%d个文件为:%s%\t文件大小为:%d字节",i,FH.fname,FH.flength);//输出结点信息
					if(FH.flength>0)
						fseek(maxbag,FH.flength,1);//跨过文件内容只读取结点信息
					i++;
					fread(&FH,sizeof(struct Fhead),1, maxbag);//读取下一个结点的信息
				}
				fclose(maxbag); //关闭文件
				break;
			}
		case 3:
			{
				printf("\n\t\t请输入解压文件名: ");
				scanf("%s",filename);  //输入文件名
				if ((maxbag=fopen(filename,"rb"))==NULL)//为输入打开一个文件
					
				{
					printf("\n\t\tcannot open file");
					exit(0);
				}
				
				temp = (char *)malloc(1024); //在内存中申请一段存取空间
				fread(&FH,sizeof(struct Fhead),1, maxbag);//读取小文件的结点信息
				
				while(!feof(maxbag))//当文件未读取结束时循环
				{
					if((minbag=fopen(FH.fname,"wb"))==NULL)//用结点中的名字做小文件的名字为输出打开一个文件
					{
						printf("\n\t\tcannot open file\n");
						exit(0);
					}
					length=FH.flength;
					
					while(length)
					{
						
						if(length>=1024)
						{
							fread(temp,1024,1,maxbag);//从打包文件中读取1024个字节到内存中
							fwrite(temp,1024,1,minbag);//把读取到内存中的信息输出到小文件中
							length=length-1024;  //每读完一段length减少1024
						}
						else
						{
                            fread(temp,length,1,maxbag); //当length小于1024时,直接读取length长度的信息到内存中
							fwrite(temp,length,1,minbag);//把读取到内存中的信息输出到小文件中
							length=0;//length置零,退出循环
						}
						
						
					}
					fclose(minbag);//关闭文件
					
					fread(&FH,sizeof(struct Fhead),1, maxbag);//读取小文件的结点信息
					
				}
				printf("\t\t解压成功\n");
				fclose(maxbag);//关闭文件
				free(temp);//释放内存
			}
			break;
		case 0:
			printf("\n\t\t已经退出\n");
			flag=0;
			
			
	 }
  }
		
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -