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

📄 rcwwork1.cpp

📁 文件打包及解压。用c语言编制的打包解压源代码
💻 CPP
字号:
// 题目要求:设计一个把若干小文件打包到一个大文件中的程序,
// 可以采用C/C++编程实现。程序需要完成以下功能:
// 1)把若干小文件打包到一个文件中;
// 2)把打包文件中的小文件恢复成原始文件(不改变文件类型);
// 3)浏览打包文件中都有哪些小文件,其文件名、扩展名、长度等都是什么?
// 	专业:计算机科学与技术			班级:064班			
//	姓名:阮崇薇			学号:06081421
//	设计完成日期:2008.10.25
//	程序说明(函数功能、参数、说明)
//writefile函数将被打包的文件打到目标文件中去,

#include<iostream>
#include<string>
using namespace std;
struct File
{
	char filename[20];
	long filelength;
};
void  writefile(FILE *fpsource,FILE *fpdest)
{
	char *p;
	p=new char[1024];
	long length;
	fseek(fpsource,0l,2);//将打包文件的指针位置移到该文件的尾部
	length=ftell(fpsource);//打包文件的字节数
	rewind(fpsource);//还原指针
	while(length>=1024)//当文件长度大于1024时
	{
		fread(p,1,1024,fpsource);
		fwrite(p,1,1024,fpdest);
		length-=1024;
	}
	fread(p,1,length,fpsource);//小于1024时以字符长度进行读写
	fwrite(p,1,length,fpdest);
	delete []p;
}

int main()
{

	int j;//选择的操作数
	long len;//文件的长度
	File file;
    while(1)
	{
		FILE *faim;//目标文件
    	FILE *fp1;//待被打包的文件 
    	char *p;
		cout<<endl<<"------------------文件打包解压操作---------------------"<<endl;
	    cout<<endl<<"1-打包文件;          2-分开打包后的文件";
		cout<<endl<<"3-浏览打包后文件信息;    0-退出";
		cout<<endl<<"请选择操作类型: ";
		cin>>j;
		switch(j)
		{
		case 1:
			cout<<"请输入你要打包的文件名格式如下:"<<endl;
			cout<<"名称.扩展名(现给出a.txt和b.txt,请选择其一)"<<endl;
			scanf("%s",file.filename);
			if((fp1=fopen((file.filename),"rb"))==NULL)
			{
				cout<<"对不起没有这个文件"<<endl;
			}
			else 
			{
				p=new char[1024];
				fseek(fp1,0l,2);//将打包文件的指针位置移到该文件的尾部
				file.filelength=ftell(fp1);//打包文件的字节数
				len=file.filelength;//待被打包文件长度 
				fseek(fp1,0l,SEEK_SET);//将打包文件指针位置放回开头
				faim=fopen("打包后的文件.t","ab+");//打开目标文件
				fwrite((char*)&file,sizeof(struct File),1,faim);//将文件信息写进目标文件
				writefile(fp1,faim);//用函数写文件的内容
		        cout<<"文件"<<file.filename<<"打包成功;"<<endl;
				fclose(fp1);//关闭文件
				remove(file.filename);
				fclose(faim);//关闭文件
				delete []p;//释放空间
			}
            break;
			case 2:
			faim=fopen("打包后的文件.t","rb");//打开目标文件
			if(faim==NULL)
			{
				cout<<"文件未打包,请选择1 进行文件打包。"<<endl;
			}else
			{
			fseek(faim,0l,SEEK_END);
			len=ftell(faim);
			rewind(faim);
			p=new char[1024];
			long length,temp;
			while(len>0)
			{
				fread((char *)&file,sizeof(struct File),1,faim);
				length=file.filelength;
				temp=file.filelength;
				fp1=fopen(file.filename,"ab+");
				cout<<"\t"<<file.filename<<"\t"<<file.filelength<<endl;
				while(length>=1024)
				{
					fread(p,1024l,1,faim);//将打包文件的全部内容传入p
					fwrite(p,1024l,1,fp1);//将p的东西全部传给目标文件
					length=length-1024;
				}
				fread(p,length,1,faim);//将打包文件的全部内容传入p
				fwrite(p,length,1,fp1);//将p的东西全部传给目标文件
				len=len-sizeof(struct File)-temp;
				fclose(fp1);//关闭文件
			
			}delete []p;
			fclose(faim);//关闭文件	
			cout<<endl<<">>文件分开完成<<"<<endl;
			}
			remove("打包后的文件.t");
			break;
			case 3:
			faim=fopen("打包后的文件.t","rb");//打开目标文件
			if(faim==NULL)
			{
				cout<<"文件未打包,请选择1 进行文件打包。"<<endl;
			}else
			{
	    	fseek(faim,0l,SEEK_END);
			len=ftell(faim);
			rewind(faim);
			cout<<"\t"<<"文件名 "<<"\t"<<"字节数 "<<endl;
			faim=fopen("打包后的文件.t","rb");
			while(len>0)
			{
				fread((char *)&file,sizeof(struct File),1,faim);
				cout<<"\t"<<file.filename<<"\t"<<file.filelength<<endl;
				fseek(faim,file.filelength,SEEK_CUR);
				len=len-file.filelength-sizeof(struct File);
			}
				remove("打包后的文件.t");
			}
			break;
        case 0:  
			exit(0);
		default: 
			cout<<"对不起请输入正确的选项"<<endl;break;
		}
	}


	return 0;
}

⌨️ 快捷键说明

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