📄 rcwwork1.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 + -