编写一个程序,将文件打包,在需要解包。可以得到你想要的打包中的文件。

这程序实现了任意文件的打包及解包,但是自己没有添加压缩及解压的算法。准确的来说应该是自己不知道算法。


#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;
        }
    }

}


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值