📄 8-2-20.c
字号:
/*中国系统分析员顾问团,http://www.csai.cn*/
/*程序员下午考试指南书籍源码*/
#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 = ftell(fin); /*保留合并文件读/写位置*/
fseek(fin,inp->offset, SEEK_SET); /*定位于被恢复文件首*/
copyfile( fin, fout, inp ->length );
fclose( fout );
printf( "\n---文件名: %\n 文件长: %1d.\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]);
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.fname, "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 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -