请高手解说——高程之文件操作例题::莫名其妙~~

tjjmmtds 2003-08-24 02:33:29
可能是语文没学好了:(
看了半天下面的这段描述,再结合程序看看,还是不明白,这段文字要求是什么?题意是什么意思??
什么“合并”“恢复”“原始文件”的一大堆,又有什么结构的……我倒~~
哪位高手给偶解说一下题目的意思啊?——用通俗易懂的话来表白一下。。。
再告诉我这段程序运行时,我需要做哪些哪些事情(步骤)?

另外,我在程序中注释中有个关于类型转换的疑问(见下),既然sizeof是无符号型的,我把它强制转成long型为何不行啊?


---------
下面的程序从合并文件中恢复出其中一个或全部原始文件。所有文件都以二进制方式处理。存放顺序是:先逐个顺序存放各原始文件,然后顺序存放各原始文件的控制信息:文件名、文件长度和其在合并文件中的起始位置(偏移量),控制信息的格式如FileInfo结构,在合并文件的最后存放一个特殊的FileInfo结构作为合并文件的结束标记:FileInfo EndFlag={"CombinedFile",0,_offset};
其中_offset是第一个原始文件的控制信息在合并文件中的起始位置(偏移量)。
本程序的运行格式:
程序名 <合并文件名> [<原始文件名>]
这是用命令行参数的运行方式。如果不指定<原始文件名>,此程序将默认恢复合并文件中的所有原始文件;如果运行是没有输入命令行参数,则程序会提示输入<合并文件名>。

#include <stdio.h>
#include <string.h>

typedef struct
{
char fname[256];
long length;
long offset;
}FileInfo;

void copyfile(FILE *fin,FILE *fout,int fsiz)
{
char buf[1024];
int siz=1024;
while(fsiz!=0)
{
if (siz>fsiz)siz=fsiz;
fread(buf,1,siz,fin);
fwrite(buf,1,siz,fout);
fsiz=fsiz-siz;
}
}

int dofile (FILE *fin,FileInfo *inp)
{
long offset;
FILE *fout;
if((fout=fopen(inp->fname,"wb"))==NULL)
{
printf("创建文件错误:%s\n",inp->fname);
return 1;
}
offset=ftell(fin);
fseek(fin,inp->offset,SEEK_SET);
copyfile(fin,fout,inp->length);
fclose(fout);
printf("\n---文件名:%s\n文件长:%ld.\n",inp->fname,inp->length);
fseek(fin,offset,SEEK_SET);
return 0;
}

int main (int argc,char *argv[])
{
FileInfo finfo;
char fname[256];
FILE *fcmbn;
if(argc<2)
{
printf("输入合并文件名:");
scanf("%s",fname);
}
else
strcpy(fname,argv[1]);
fcmbn=fopen(fname,"rb");
if(fcmbn==NULL)
{
printf("文件打开错误:%s\n",fname);
return 1;
}
fseek(fcmbn,-sizeof(FileInfo),SEEK_END);/*改为fseek(fcmbn,-(long*)(sizeof(FileInfo)),SEEK_END);为何不行?*/
fread(&finfo,1,sizeof(FileInfo),fcmbn);
if(finfo.length!=0||strcmp(finfo.fname,"CombinedFile"))
{
printf("指定的文件不是合法的合并文件。\n");
fclose(fcmbn);
return 2;
}
fseek(fcmbn,finfo.offset,SEEK_SET);
for(;;)
{
fread(&finfo,1,sizeof(FileInfo),fcmbn);
if(finfo.length==0)break;
if(argc>2&&strcmp(finfo.fname,argv[2]))continue;
if(dofile(fcmbn,&finfo)!=0)break;
}
fclose(fcmbn);
return 0;
}
...全文
24 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ironox 2003-08-24
  • 打赏
  • 举报
回复
也觉得头大,改天来看

2,947

社区成员

发帖
与我相关
我的任务
社区描述
就计算机等级考试、软件初、中、高级不同级别资格考试相关话题交流经验,共享资源。
c1认证c4javac4前端 技术论坛(原bbs)
社区管理员
  • 软件水平考试社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧