这程序实现了任意文件的打包及解包,但是自己没有添加压缩及解压的算法。准确的来说应该是自己不知道算法。
#include<stdio.h>
#include<string.h>//创建保存文件的名称及长度的结构体
struct filestruct
{
char filename[30];
int filelength;
};
//================================
//名称: menu
//功能: 显示菜单
//参数: void
//返回值: void
//================================
void menu(void)
{
printf("===========================\n");
printf("========1.打包文件=========\n");
printf("========2.解包文件=========\n");
printf("========3.退出=============\n");
printf("===========================\n");
}
//================================
//名称: FileLength
//功能: 计算文件的长度
//参数: String
//返回值:int
//================================
int FileLength(char String[])
{
FILE *fp;
char ch;
int Len=0;
fp=fopen(String,"rb");
while(1)
{
ch=fgetc(fp);
if(feof(fp))
{
break;
}
Len++;
}
return Len;
}
//================================
//名称: FileToZip
//功能: 打包文件
//参数: void
//返回值:void
//================================
void FileToZip(void)
{
FILE *fp,*fq;
char str1[30];
char str2[]={"#"};
char st[30];
char ch;
struct filestruct tmp;
//输入包名
printf("请输入包名:\n");
scanf("%s",st);
fp=fopen(st,"wb+");
//获取并打包文件名及文件内容
while(1)
{
printf("请输入要打包文件的文件名:‘#’表示结束打包:\n");
scanf("%s",str1);
if(strcmp(str1,str2)==0)
{
break;
}
fq=fopen(str1,"rb");
if(fq==NULL)
{
printf("文件不存在!!!");
break;
}
strcpy(tmp.filename,str1);
tmp.filelength=FileLength(tmp.filename);
fwrite(&tmp,sizeof(tmp),1,fp);
while(1)
{
fread(&ch,1,1,fq);
if(feof(fq))
{
fclose(fq);
break;
}
fwrite(&ch,1,1,fp);
}
//标记测试
printf("文件名字为%s\t文件的长度为%d\n",tmp.filename,tmp.filelength);
}
fclose(fp);
}
//================================
//名称: ZipToFile
//功能: 解开打包文件
//参数: void
//返回值: void
//================================
int ZipToFile(void)
{
int i;
char ch;
FILE *fp,*fq;
char String[30];
struct filestruct tmp;
printf("请输入你要解包的文件:\n");
scanf("%s",String);
//打开文件包
fp=fopen(String,"rb");
if(fp==NULL)
{
printf("文件不存在,打开失败!!!\n");
return;
}
//判断文件是否为空
if(feof(fp))
{
return;
}
//将文件包中的内容写出到文件中
printf("解包后包中的文件有:\n");
while(1)
{
if(feof(fp))
{
break;
}
fread(&tmp,sizeof(tmp),1,fp);
fq=fopen(tmp.filename,"wb+");
for(i=0;i<tmp.filelength;i++)
{
fread(&ch,1,1,fp);
if(feof(fp))
{
return;
}
fwrite(&ch,1,1,fq);
}
fclose(fq);
//标记测试
printf("文件名字为%s\t文件的长度为%d\n",tmp.filename,tmp.filelength);
}
fclose(fp);
}
//================================
//名称: main
//功能:
//参数: void
//返回值: void
//================================
void main(void)
{
int key;
while(1)
{
menu();
printf("请选择:\n");
scanf("%d",&key);
switch(key)
{
case 1:
FileToZip();
break;
case 2:
ZipToFile();
break;
case 3:
return;
break;
default :
break;
}
}
}