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