2001年程序员考试题目,难题,高手请进

zhaomaster 2003-08-20 10:51:44
阅读下列程序说明和C代码,将应填入__(n)__处的字句写在答题纸的对应栏内。
[程序3说明]
本程序从若干个原始文件合并成的合并文件中恢复出其中一个或全部原始文件。所有文件均作为二进制文件进行处理。合并文件中先顺序存储各原始文件,然后顺序存储各原始文件的控制信息,即文件名、文件长度和在合并文件中的位置(偏移量)。其结构为:
typedef stmct{char fnme[256];/*原始文件名*/
long length;/*原始文件长度(字节数)*/
long offset;/*原始文件在合并文件中的位置(偏移量)*/
}FileInfo;
在合并文件最后存储如下一个特殊的标志信息作为合并文件的结束标记:
F11ek1fo EndF1ag={"Combined File".0,_offset};
其中_offset是第一个原始文件的控制信息在合并文件中的位置(偏移量)。
启动本程序的命令行的格式是:
程序名 合并文件名[原始文件名]
如果不指定原始文件名,默认恢复合并文件中的所有原始文件。
程序中涉及的部分文件操作的库函数简要说明如下:
int fread(void *buffer,int size,int count,FILE *fbin):从二进制文件流 fbin 中读取count块长度为size字节的数据块到buffer指向的存储区。返回值为实际读取的数据块数。
int fwrite(void *buffer,int size,int count,FILE *fbin):各参数和返回值的意义与fread相同,但对文件进行写操作。
int fseek(FILE *fbin,long offset,int position): 将文件流 fbin 的读/写位置以 position为基准移动offset字节。position的值可以是SEEK_SET(文件头),SEEK_CUR(当前位置),SEEK_END(文件尾);offset为正表示向文件尾方向移动,为负表示向文件头方向移动,为零表示到基准位置。
long ftell(FILE *fbin): 返回文件流 fbin 的当前读/写位置(相对于文件头的偏移量)。上述偏移量均以字节为单位,即偏移字节数。
[程序3]
#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) { /*每次复制siz个字节,直至复制完fsiz个字节*/
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 = __(3)__ ; /*保留合并文件读/写位置*/
<--> fseek( __(4)__) ; /*定位于被恢复文件首*/
copyfile( fin , fout , inp -〉length ) ;
fclose( fout ) ;
printf( "\n---文件名: %\n 文件长: %1d.\n " , inp -〉fname , inp -〉length );
<--> __(5)__; /*恢复合并文件读/写位置*/
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]) ;
if ( ( fcmbn = fopen( fname , "rb" ) ) == NULL) {
printf( "文件打开错误:%s\n" , fname ) ; return 1;
}
fseek( fcmbn ,-sizeof(FileInfo),SEEK END);/*定位于合并文件末尾的标志信息*/
fread(&finfo,1,sizeof(FileInfo),fcmbn) ;
if ( finfo.length !=0 || strcmp( finfo.fmane , "CombinedFile" ) ) {
printf( "指定的文件不是合法的合并文件\n" ) ;
fclose( fcmbn ) ; return 2 ;
}
fseek(fcmbn,finfo.offset,SEEK_SET );/*定位于首个原始文件的控制信息*/
for ( ; ; ) { /*恢复一个(argc > 2) 或全部 ( argc = 2 )原始文件*/
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 ;
}
有没有感觉(3),(4)有错误呢???哪里来的fm????????
(3) ftell(fm)
(4) fm,inp->offset, SEEK_SET
(5) feesk(fin ,offset, SEEK_SET)
想问问高手们(3),(4),(5)的答案是怎么做出来的呢?
...全文
28 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
qingyihao0716 2003-08-24
  • 打赏
  • 举报
回复
上机调一下应该会清楚了吧。
tjjmmtds 2003-08-24
  • 打赏
  • 举报
回复
参考http://expert.csdn.net/Expert/topic/2182/2182440.xml?temp=.6706659

wbh0360 2003-08-22
  • 打赏
  • 举报
回复
(1) siz = fsiz
(2) fsiz-siz
(3) ftell(fm)
(4) fm,inp->offset, SEEK_SET
(5) feesk(fin ,offset, SEEK_SET)
zhaomaster 2003-08-22
  • 打赏
  • 举报
回复
感谢各位高手
非常谢谢
lybapple 2003-08-22
  • 打赏
  • 举报
回复
一起学习ing。
yzb1000 2003-08-22
  • 打赏
  • 举报
回复
好长的题目啊
wilddonkey 2003-08-22
  • 打赏
  • 举报
回复
up
hellobcb 2003-08-20
  • 打赏
  • 举报
回复
我不是高手,但我可以说说意见:
合并文件的结构是这样的:
File1...
.......
File2...
........
File1的信息:(文件名,长度,偏移)//控制信息a
File2的信息:(文件名,长度,偏移)//控制信息b
.....
文件结尾:控制信息a的信息
////////////
首先,fm应该是fin。
(3)处,程序将根据控制信息读原始文件,ftell是为了记录合并文件中下一控制信息的位置。
(4)处是根据控制信息找到相应的原始文件的位置,并根据控制信息中的文件长度读出合并文件的内容,输出到以控制信息中的文件名命名的fout文件中。
(5)处,因为fin文件的读写位置已经变化,不再指向控制信息,所以这里,可以根据保存的offset使文件重新定位到下一控制信息处。
rtdb 2003-08-20
  • 打赏
  • 举报
回复
没仔细看。

不过显然fm应该是fin,是印错了或看错了吧。

这类问题,上机调一下就明白了。
zhaomaster 2003-08-20
  • 打赏
  • 举报
回复
在delphi版放了一天,没有人解答
希望本版有高手回答 先谢谢了
zhaomaster 2003-08-20
  • 打赏
  • 举报
回复
先up一下
lcp 2003-08-20
  • 打赏
  • 举报
回复
同意 hellobcb(学海无涯酷作舟)
fm应该是fin;
3先保存文件fin当前偏移量;
4.根据文件信息结构,移动文件指针,用于下一步拷贝内容;
5.最后,恢复文件fin的指针到第3步保存的位置。


3. ftell(fin);
4. fin, inp->offset, SEEK_SET
5. fseek( fin , offset , SEEK_SET )
fancy123 2003-08-20
  • 打赏
  • 举报
回复
agree with hellobcb(学海无涯酷作舟),他解释的非常好。
我简单说一下主程序的流程:
fseek( fcmbn ,-sizeof(FileInfo),SEEK END);/*定位于合并文件末尾的标志信息*/
fread(&finfo,1,sizeof(FileInfo),fcmbn) ;
if ( finfo.length !=0 || strcmp( finfo.fmane , "CombinedFile" ) ) {
printf( "指定的文件不是合法的合并文件\n" ) ;
fclose( fcmbn ) ; return 2 ;
}

检查是不是合法的合并文件,如果是,将整个合并文件的信息写入finfo.

fseek(fcmbn,finfo.offset,SEEK_SET );/*定位于首个原始文件的控制信息*/
从finfo.offset中取出第一个原始文件在整个合并文件的位置,并将文件读写指针定位于此。

for ( ; ; ) { /*恢复一个(argc > 2) 或全部 ( argc = 2 )原始文件*/
fread( &finfo , 1 , sizeof( FileInfo ) , fCmbn ) ;/*读取下一个原始文件filfo*/
if ( finfo.length == 0 ) break ;/*恢复完毕,退出*/
if ( argc > 2 && strcmp( finfo.fname , argv[2] ) ) continue ;/*指定了被恢复文件,寻找合法的finfo,不符合continue*/
if ( dofile( fcmbn , &finfo ) != 0 ) break ;/*恢复文件,异常处理*/
}
(详见注释)
Bill_rao 2003-08-20
  • 打赏
  • 举报
回复
不看了。我做过这道题。挺复杂,没功夫帮你看。自己找本历年试题解答,就ok了。
dingsea 2003-08-20
  • 打赏
  • 举报
回复
ipnu!
xdzr 2003-08-20
  • 打赏
  • 举报
回复
学习
dddd8888 2003-08-20
  • 打赏
  • 举报
回复
UP 共同学习

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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