}
for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i flag++;/*统计磁盘上为空数目*/ if(flag==0) { printf(\统计结果为0,则磁盘已满*/ return 0; } printf(\ printf(\ for(j=0;j<32;j++) if(fil[j].firstblockaddr==0) break; while(1) {scanf(\输入目录项中文件的长度*/ n=(dir[j].filelen/BlockSize)+(dir[j].filelen%BlockSize?1:0); if(n<0||n>flag)/*文件长度小于0或大于空闲的空间 */ {printf(\ printf(\ } else break; } for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.rootblocknum);i { if(fat1[i]==0) { k++; if(flag2==0) { dir[j].firstblockaddr=i+1; flag2=1; } else { if(k>=n)/*n 文件长度*/ { fat1[m]=i+1; fat1[i]=-1; break; }else fat1[m]=i+1; } m=i; } } strcpy(dir[j].filename,filename); dir[j].filename[a]='\\0'; printf(\ scanf(\ printf(\ scanf(\ printf(\ scanf(\ return (1); } int FDELETE(char *filename)/*删除文件 */ {int i,j,k,n,flag=0; struct FCBBlock *p;/*文件控制块指针*/ p=fcb; while(p) {if(strcmp(filename,fil[p->fdtblockindex].filename)==0)/*目录项所在序号 */ {printf(\ return 0; } else p=p->next; } for(i=0;i<32;i++)/*查找要关闭的文件 */ if(strcmp(filename,fil[i].filename)==0) { flag=1; break; } if(flag==0) {printf(\return 0; } j=fil[i].firstblockaddr; while(1) { k=fat1[j-1]; fseek(fp,(j-1)*BlockSize,0);/*将指针指向文件的第一个扇区的位置 */ fwrite(&fillchar,1,BlockSize,fp); fat1[j-1]=0; if(k==-1) break; else j=k; } memset(&fil[i],0,DirSize); return 1; } int FOPEN(char *filename)/*打开文件*/ { int i,j=0,k,flag=0; struct FCBBlock *p,*q,*r; p=fcb; for(i=0;i<32;i++) if(strcmp(filename,fil[i].filename)==0)/*找到要打开的文件*/ { flag=1; break; } if(flag==0) {printf(\ return 0; } while(p) {j++; if(strcmp(filename,fil[p->fdtblockindex].filename)==0) { printf(\ return 0; } q=p; p=p->next; } if(fcb==NULL) { fcb=(struct FCBBlock *)malloc(sizeof(struct FCBBlock)); fcb->fileid=j+1;/*文件标示*/ fcb->filepos=0;/*文件读写指针 */ fcb->next=NULL;/*指向下一个文件控制指针 */ fcb->fdtblockindex=i; } else { r=(struct FCBBlock *)malloc(sizeof(struct FCBBlock)); r->fileid=j+1; r->filepos=0; r->next=NULL; r->fdtblockindex=i; q->next=r; } /*f->next=NULL; */ return 1; } long FGETLEN(int fileid)/*获取文件指针 */ { struct FCBBlock *p; p=fcb; while(p) {if(p->fileid==fileid)/*寻找要找的指针*/ return(p->filepos); p=p->next; } printf(\ return(0); } int FCLOSE(char *filename)/*关闭文件 */ { int flag=0; struct FCBBlock *f,*p; f=fcb; if(strcmp(filename,fil[fcb->fdtblockindex].filename)==0) { flag=1; fcb=fcb->next; p=fcb; while(p) {p->fileid-=1; p=p->next; } return flag; } p=f; f=f->next; while(f) { if(strcmp(filename,fil[f->fdtblockindex].filename)==0) { flag=1; p=f->next; /*p=p->next;*/ while(p) { p=p->next; p->fileid-=1; } free(f); return flag; } p=f; f=f->next; } if(flag==0) { printf(\ return flag; } return 0; } int FREAD(char *str, int n, int fileid)/*文件块读*/ { int m,i,j=0,k,l,len; char a[3]; struct FCBBlock *p; p=fcb; while(p) {if(p->fileid==fileid) break; else p=p->next; } len=fil[p->fdtblockindex].filelen;/*文件长度*/ l=p->filepos;/*文件读写指针:该块在文件的相对位置*/ printf(\ printf(\ printf(\ scanf(\ if(a[0]=='n'||a[0]=='N') {printf(\ while(1) {scanf(\ if(fil[p->fdtblockindex].filelen<(l+n))/*? */ printf(\ else break; } } while(1) { if(n>fil[p->fdtblockindex].filelen) {printf(\ printf(\ scanf(\ } else break; } str=(char *)malloc(fil[p->fdtblockindex].filelen+1); m=(len/BlockSize)+(len%BlockSize?1:0); k=fil[p->fdtblockindex].firstblockaddr; if(m>1) { fseek(fp,(k-1)*BlockSize,0); fread(str,BlockSize,1,fp); k=fat1[k-1]; for(i=1;i<(m-1);i++) {fseek(fp,fat1[k-1]*BlockSize,0); fread(&str[i*BlockSize],BlockSize,1,fp); k=fat1[k-1]; } fseek(fp,(k-1)*BlockSize,0); fread(&str[i*BlockSize],len-i*BlockSize,1,fp); } else