{
char name[20]; /*文件绝对路径名*/
char attribute;/*文件的属性,用1个字节表示,所以用了char类型*/ int number; /*文件起始盘块号*/
int length; /*文件长度,文件占用的字节数*/
int flag; /*操作类型,用\表示以读操作方式开文件,用\表示写操作pointer read; /*读文件的位置,文件刚打开时dnum为文件起始盘块号,bnumpointer write; /*写文件的位置,文件建立时dnum为文件起始盘块号,bnum
方式打开文件*/ 为\
为\,打开时为文件末尾*/
}OFILE; /*已打开文件表项类型定义*/ struct {
char buffer1[64];/*模拟缓冲1*/ content buffer2[8];/*模拟缓冲2*/ FILE *fc; /*模拟磁盘的文件指针*/
void copen(OFILE *x1,OFILE *x2) //OFILE *x1,*x2; { }
strcpy(x1->name,x2->name); x1->attribute=x2->attribute; x1->number=x2->number; x1->length=x2->length; x1->flag=x2->flag;
x1->read.dnum=x2->read.dnum; x1->read.bnum=x2->read.bnum; x1->write.dnum=x2->write.dnum; x1->write.bnum=x2->write.bnum; OFILE file[n]; /*已打开文件表*/
int length; /*已打开文件表中登记的文件数量*/
}openfile; /*已打开文件表定义*/
int sopen(char *name) /*
在
已
打
开
文
件
表
中
查
找
文
件
//P172 //char *name; {
void dopen(char *name)
/*在已打开文件表中删除文件name*/ //char *name; {
int iopen(content *x)
/*在已打开文件表中插入文件name*/ //content *x; {
int i;
i=sopen(name); if(i==-1) { }
copen(&openfile.file[i],&openfile.file[openfile.length-1]); openfile.length--; printf(\文件未打开\\n\else int i; i=0;
while(i i++; return(-1); name*/ 依次查找已打开文件表*/ if(i>=openfile.length) return(i); }/*查找sopen函数结束*/ }/*删除函数结束*/ int i; i=sopen(x->name); if(i!=-1) { } else if(openfile.length==n) { } else { } //copen(&openfile.file[openfile.length],x); openfile.length++; return(true); printf(\已打开文件表已满\\n\return(false); printf(\文件已经打开\\n\return(false); }/*填写已打开文件表函数结束*/ int allocate( ) /*分配一个磁盘块,返回块号*/ { */ //P173 int i; fseek(fc,0,SEEK_SET); /*将模拟磁盘的文件指针移至模拟磁盘FAT表*/ fread(buffer1,64L,1,fc);/*将FAT表中第一个磁盘块读入模拟缓冲for(i=3;i<63;i++) if(buffer1[i]==0) { /*FAT中的第i项为0,分配第i块磁盘块,修改FAT表,并且写回磁盘 buffer1中*/ buffer1[i]=255; } fseek(fc,0,SEEK_SET); fwrite (buffer1,64L,1,fc); return(i); /*返回磁盘号*/ fread(buffer1,64L,1,fc);/*将FAT表中第二个磁盘块读入模拟缓冲for(i=0;i<63;i++) if(buffer1[i]==0) {/*FAT中的第i项为0,分配第i+64块磁盘块,修改FAT表,并且写 } printf(\已经没有磁盘空间\\n\return(false); buffer1[i]=255; fseek(fc,-64L,SEEK_CUR); fwrite(buffer1,64L,1,fc); return(i+64); /*返回磁盘号*/ buffer1中*/ 回磁盘*/ }/*分配磁盘块函数结束*/ int read_file(char *name,int length) /*读文件函数,文件路径名name,读取长度length*/ //char *name; //int length; { int i,t; //char ch; if((i=sopen(name))==-1) { } if(openfile.file[i].flag==1) { printf(\文件以写方式打开,不能读\\n\printf(\文件没有打开或不存在\\n\return (false); } return 0; t=0; fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET); fread(buffer1,64,1,fc); while(t openfile.file[i].read.dnum=buffer1[openfile.file[i].read.dnumd] } } t++; openfile.file[i].read.bnum=0; fseek(fc,openfile.file[i].read.dnum*64L,SEEK_SET); fread(buffer1,64,1,fc);/*读取下一个*/ putchar(buffer1[openfile.file[i].read.bnum]);/*读出一个字符(这if((t+1)d==0)putchar('\\n'); /*修改读指针*/ openfile.file[i].read.bnum++; if(openfile.file[i].read.bnum>=64)/*一块读完,读取下一个盘块*/ { fseek(fc,openfile.file[i].read.dnum/64*64, SEEK_SET); fread(buffer1,64,1,fc); 里是在屏幕上显示)*/ ;/*修改读指针*/ }/*读函数结束*/ int write_file(char *name,char *buff,int length) //P174 /*写文件函数*/ //char *name;/*文件路径名*/ //char *buff;/*存放准备写入磁盘的内容*/ //int length;/*写入内容的长度*/