下载此文档

实验四 文件系统实验报告.pdf


文档分类:IT计算机 | 页数:约32页 举报非法文档有奖
1/32
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/32 下载此文档
文档列表 文档介绍
该【实验四 文件系统实验报告 】是由【青山代下】上传分享,文档一共【32】页,该文档可以免费在线阅读,需要了解更多关于【实验四 文件系统实验报告 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。2、要求设计一个n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。:1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。2、程序采用二级文件目录(即设置主目录[MFD])和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。4、算法与框图:①因系统小,文件目录的检索使用了简单的线性搜索。②文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。③程序中使用的主要设计结构如下:主文件目录和用户文件目录(MFD、UFD)打开文件目录(AFD)(即运行文件目录)MDFUFDAFD用户名文件名打开文件名文件目录指针保护码打开保护码用户名文件长度读写指针文件目录指针文件名··:..:1、增加2~3个文件操作命令,并加以实现。(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。#include<>#include<>#include<>#include<>#defineMAXSIZE100#defineADDSIZE50#definePTelem+l->length#defineN4typedefstructterm{/*班级和学期的结构体*/charclass1[10];charterm1[10];}term;typedefstructstudent{/*学生成绩信息的结构体*/termst;/*班级和学期结构体放于此结构体中*/charnum[10];charname[12];floatcourse[4];floattotal;floataverage;intbit;}lnode,*stu;typedefstruct{lnode*elem;/*指向上个结构体的指针*/intsize;/*最大能放lnode结构体成员的个数*/intlength;/*当前长度*/}sqack,*sq;sqack*l;voidinit(void)/*动态分配存储空间*/{l->elem=(stu)malloc(MAXSIZE*sizeof(lnode));l->length=0;l->size=MAXSIZE;}voidinput(void)/*输入学生的信息*/{lnode*newbase,*p;charcla[10],ter[10],ch;intn,i;if(l->length>=l->size){newbase=(stu)realloc(l->elem,(l->size+ADDSIZE)*sizeof(lnode));/*追加存储空间*/l->elem=newbase;l->size+=ADDSIZE;}p=l->elem;do{输入班级和学期(学期用这种格式,如2005年上学期20051,2005年下学期20052;先输入班级,回车后再输入学期)gets(cla);gets(ter);要输入多少个名单?输入学生的成绩学号 姓名 科目1 科目2 科目3 科目for(i=0;i<n;i++){strcpy(p->,cla);strcpy(p->,ter);++l->length;}要继续吗?:..}voidchange()/**/{lnode*p;lnodee;intflag=1,i;chars1[10],num1[10];输入学期和学号(输入学期以后按回车再输入学号gets(s1);gets(num1);p=l->elem;while(p<=(l->elem+l->length)&&flag==1)/*查找要修改的学生的信息*/{if(strcmp(p->num,num1)==0&&strcmp(p->,s1)==0)flag=0;/*找到了*/p++;}p--;找不到此学号!for(i=0;i<N;i++)输入修改信息for(i=0;i<N;i++)*p=e;}voidsame(char*t1,char*t2,lnode*t,int*k)/*把学期和班级相同的学生信息放在结构体数组tt中*/{inti=0;lnode*p,*q;q=t;p=l->elem;while(p<=l->elem+l->length){if(strcmp(p->,t1)==0&&strcmp(p->,t2)==0){*q=*p;q++;i++;}p++;}*k=i;}voidsort(lnode*p,int*k)/*按学生成绩从高到低排序函数*/{inti;lnode*q,temp;for(q=p;q<p+*k;q++){q->total=0;for(i=0;i<N;i++)q->total=q->total+q->course[i];q->average=q->total/N;}for(i=0;i<*k-1;i++)for(q=p;q<p+*k-1-i;q++)if(q->total<(q+1)->total){:..}}voidprint(lnode*q,int*k)/**/{lnode*p;p=q;for(p=q;p<q+*k;p++){for(inti=0;i<N;i++)}}voidstat()/*统计学生的成绩*/{lnodett[50];charter[10],clas[10];inti,k;请输入学期和班级(输入学期后按回车再输入班级for(i=0;ter[i]!='';i++)ter[i]=getchar();for(i=0;clas[i]!='';i++)clas[i]=getchar();same(ter,clas,tt,&k);/*把学期和班级相同的学生信息放在结构体数组tt中*/sort(tt,&k);/*按学生成绩从高到低排序函数*/print(tt,&k);/*输出学生的成绩*/}voidsearch1()/*按学号查*/{lnode*p;charter1[10];inti,flag=1;p=l->elem;输入学号:gets(ter1);for(p=l->elem;p<l->PT;p++){if(strcmp(p->num,ter1)==0){flag=0;for(i=0;i<N;i++)}}没有找到!}voidsearch2()/*按姓名查*/{lnode*p;charter1[10];inti,flag=1;p=l->elem;输入姓名::..for(p=l->elem;p<l->PT;p++){if(strcmp(p->name,ter1)==0){flag=0;for(i=0;i<N;i++)}}}voidsearch()/*查找学生的成绩*/{charch;do{按学号查询2按姓名查询ch=getchar();switch(ch){case'1':search1();break;case'2':search2();break;default:错误!}要继续查找吗?ch=getchar();}while(ch=='y'||ch=='Y');}voidfail()/*查找不及格及学生名单*/{inti;lnode*p;for(p=l->elem;p<l->PT;p++){for(i=0;i<N;i++)if(p->course[i]<60){for(i=0;i<N;i++)}voidoutput()/*按班级输出学生的成绩单*/{lnodett[50];intk;charclas[10],ter1[10];输入要查询的班级和学期(输入班级后按回车输入学期)gets(clas);gets(ter1);same(ter1,clas,tt,&k);/*把学期和班级相同的学生信息放在结构体数组tt中*/print(tt,&k);/*输出学生的成绩*/}:..intmain(){charch;do{对学生成绩的录入2对学生成绩的修改3统计学生成绩4查询学生成绩5查找不及格科目及学生名单6按班级输出学生成绩单ch=getchar();switch(ch){case'1':input();break;case'2':change();break;case'3':stat();break;case'4':search();break;case'5':fail();break;case'6':output();break;错误!}要继续吗?ch=getchar();}while(ch=='y'||ch=='Y');return0;getch();}2、编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。#include<>#include<>#include<>//主文件结构体structMasterFile{charusername[20];//用户名charpassword[20];//用户名密码charflag;//标志structMasterFile*next;};//用户文件结构体structUserFile{intfnum;//文件编号charfname[20];//文件名intflength;//文件长度charflag;//标志charfpw[20];//文件保护码structUserFile*link;};//全局变量intshoudsave;//存储标记intusingnum;//当前用户标记structMasterFileMFD[20];//主目录structUserFileUFD[20][20];//用户目录:..//寻找主目录空闲区structMasterFile*MoveMFDToLast(){for(inti=0;i<20;i++){if(MFD[i].flag==0)usingnum=i;return&MFD[i];}returnNULL;}//查找用户structMasterFile*SearchMFD(charstr[]){for(inti=0;i<20;i++){if(strcmp(str,MFD[i].username)==0){usingnum=i;return&MFD[i];}}returnNULL;}//寻找用户目录空闲区structUserFile*MoveUFDToLast(){for(inti=0;i<20;i++){if(UFD[usingnum][i].flag==0)return&UFD[usingnum][i];}returnNULL;}//查找用户文件structUserFile*SearchUFD(intnum){for(inti=0;i<20;i++){if(UFD[usingnum][i].fnum==num)return&UFD[usingnum][i];}returnNULL;}//删除用户文件目录voidLeftMoveUFD(intnum){for(inti=0;i<20;i++){if(UFD[usingnum][i].fnum==num){for(intj=i;j<19;j++){:..UFD[usingnum][i].flength=UFD[usingnum][i+1].flength;strcpy(UFD[usingnum][i].fname,UFD[usingnum][i+1].fname);UFD[usingnum][i].fnum=UFD[usingnum][i+1].fnum;strcpy(UFD[usingnum][i].fpw,UFD[usingnum][i+1].fpw);UFD[usingnum][i].link=UFD[usingnum][i+1].link;}}}}//用户登陆voidLogin(){charflag1,flag2,flag3;charstr1[20],str2[20],str3[20],str4[20];structMasterFile*p;你是已有用户吗if(flag1=='n'){//新用户登录请创建新的用户if(flag2=='n'){你已退出了系统exit(1);}else{请输入你的用户名请输入口令p=MoveMFDToLast();strcpy(p->username,str1);strcpy(p->password,str2);p->flag=1;p->next=NULL;shoudsave=1;//存储标记}}else{//旧用户登录while(1){请输入你的用户名输入用户名p=SearchMFD(str3);if(p==NULL){对不起,你输入的用户名不存在:..(y)还是放弃if(flag3=='y')continue;else{你已退出了系统exit(1);}}else{while(1){请输入口令输入口令if(strcmp(str4,p->password)!=0){对不起,你输入的口令不正确,请重新输入continue;}elsebreak;}}break;}}}//菜单voidmenu(){列文件目录 2创建文件删除文件 4读文件写文件 0退出系统}//列文件目录voidDir(){if(MFD[usingnum].next==0)目前你不存在任何文件else{for(inti=0;i<20;i++){if(UFD[usingnum][i].flag==1)文件编号 %d 文件名 %s 文件长度 %d ,UFD[usingnum][i].fpw);}:..}//创建文件voidCreate(){FILE*fp;intnum;structUserFile*f;charstr1[20],str2[20];请输入你要创建的文件名输入文件信息请输入文件编号请输入文件保护码创建文件f=MoveUFDToLast();//寻找用户目录空闲区if(&UFD[usingnum][0]==f)//连接主目录MFD[usingnum].next=(structMasterFile*)f;f->link=(structUserFile*)fp;//设置用户目录MFD[usingnum].next=(structMasterFile*)&UFD[usingnum][0];strcpy(f->fname,str1);strcpy(f->fpw,str2);f->fnum=num;f->flength=0;f->flag=1;fclose(fp);shoudsave=1;//设置存储标记文件已创建}//删除文件voidDelete(){structUserFile*f;intnum;请输入你要删除的文件编号f=SearchUFD(num);//查找用户文件if(f==NULL){你要删除的文件不存在}else{LeftMoveUFD(num);//删除用户文件目录文件已删除}:..设置存储标记}//读文件voidRead(){charch;structUserFile*f;FILE*fp;intnum;请输入你要读的文件的编号f=SearchUFD(num);//查找文件if(f==NULL){你输入的文件不存在}else{打开指定文件不能打开该文件exit(0);}}ch=fgetc(fp);//输出文件内容while(ch!=EOF){putchar(ch);ch=fgetc(fp);}fclose(fp);//关闭文件文件已读完毕}//写文件voidWrite(){charch;structUserFile*f;FILE*fp;intnum;请输入你要写的文件的编号f=SearchUFD(num);//查找文件if(f==NULL){你输入的文件不存在}else{打开指定文件不能打开该文件exit(0);}:..请按字符输入内容(以'#'表示结束符写入文件while(ch!='#'){fwrite(&ch,1,1,fp);}fclose(fp);//关闭文件shoudsave=1;//设置存储标记文件写入完毕}//保存voidSave(){FILE*fpm,*fpu;intflag=1,count=0;打开主文件if(fpm==NULL){提示:重新打开主文件信息文件时发生错误exit(1);}for(inti=0;i<20;i++)fwrite(&MFD[i],sizeof(structMasterFile),1,fpm);//保存主文件目录信息fclose(fpm);主文件目录信息保存完毕打开用户文件if(fpu==NULL){提示:重新打开用户目录信息文件时发生错误exit(1);}for(intj=0;j<20;j++)//保存用户文件目录信息fwrite(&UFD[j],sizeof(structUserFile),20,fpu);fclose(fpu);用户文件目录信息保存完毕}//主函数voidmain(){FILE*fpm,*fpu;//文件指针intsel;charch;charjian;文件管理系统打开主文件目录信息文件:..提示:主文件目录信息文件还不存在,是否创建if(jian=='y'||jian=='Y')创建主文件目录的文件elseexit(0);}打开用户文件目录信息文件if(fpu==NULL){提示:用户文件目录信息文件还不存在,是否创建if(jian=='y'||jian=='Y')创建用户文件目录的文件elseexit(0);}文件正在打开,请稍等for(inti=0;i<20;i++)//读取主文件目录信息fread(&MFD[i],sizeof(structMasterFile),1,fpm);//将文件的内容放入接点中fclose(fpm);//关闭文件while(!feof(fpu)){//读取用户目录文件信息for(inti=0;i<20;i++){if(fread(&UFD[i][0],sizeof(structUserFile),20,fpu))//将文件的内容放入接点中MFD[i].next=(structMasterFile*)&UFD[i][0];}}fclose(fpu);//关闭文件文件已导入完毕Login();//用户登录while(1){//菜单操作menu();请你选择操作if(sel==0){//保存文件信息if(shoudsave==1){getchar();资料已经改动,是否将改动保存到文件中if(ch=='y'||ch=='Y')Save();}:..,再见break;}switch(sel){case1:Dir();break;//列文件目录case2:Create();break;//创建文件case3:Delete();break;//删除文件case4:Read();break;//读文件case5:Write();break;//写文件你输的选项有误,请重新输入break;}}}3、设计一个树型目录结构的文件系统,其根目录为root,各分支可以是目录,也可以是文件,最后的叶子都是文件。#include<>#include<>#include<>#include<>#include<>#defineFILENAME_LEN21#defineINPUT_LEN81#MAND_LEN11//结点结构structFileNode{charfilename[FILENAME_LEN];//文件名/目录名intisdir;//目录文件识别标志inti_nlink;//文件的链接数intadr;//文件的地址structFileNode*parent,*child;//指向父亲的指针和指向左孩子的指针structFileNode*sibling_prev,*sibling_next;//指向前一个兄弟的指针和指向:..后一个兄弟的指针.};voidInit();//初始化文件树mand();//接受输入的命令并把其分解成操作名和路径文件名mand();//执行命令d();//处理cd命令d();//处理edit命令创建文件d();//处理del命令删除文件d();//处理rd命令/删除目录d();//处理dir命令d();//处理md命令创建目录intFindPath(char*ph);//寻找参数ph所指向的路径//从参数Para2中找到要建立或删除的文件、目录名,并把指针指向其父亲结点intFindFilename(charPara2[]);structFileNode*CreateFileNode(charfilename[],intisdir,inti_nlink);//创建结点intGetInput(char*buffer,unsignedintbuffer_len);//获取输入mand();//命令检查intGetDir(intbegin,char*path,char*curDir);//获取路径voidTrim(char*str);structFileNode*cp,*tp,*root,*upper;charpath[MAND_LEN];//记录当前走过的路径charcurpath[MAND_LEN],MAND_LEN],Para2[MAND_LEN],tmppath[MAND_LEN];charfilename[FILENAME_LEN],dirname[FILENAME_LEN],tmp;inti,j;//主函数intmain(){杜耀军树型目录结构的文件系统Init();//初始化文件树while(1){if(mand())//分解命令mand();//执行命令:..}//执行命令子函数mand(){intsign;//根据参数Para1调用相应的功能处理模块sign=d();//cd命令sign=d();//edit命令sign=d();//del命令sign=d();//dir命令sign=d();//md命令sign=d();//rd命令exit(0);//exit命令else命令错误,请重试命令输入不正确,报错}//创建结点structFileNode*CreateFileNode(charfilename[],intisdir,inti_nlink){//申请结点空间structFileNode*node=(structFileNode*)malloc(sizeof(structFileNode));//相应内容赋初值strcpy(node->filename,filename);node->isdir=isdir;node->i_nlink=i_nlink;node->parent=NULL;node->child=NULL;node->sibling_prev=NULL;node->sibling_next=NULL;returnnode;}//初始化文件树:..{structFileNode*binNode,*usrNode,*unixNode,*ode,*libNode,*userNode,*binNode2,*liuNode,*sunNode,*ftiNode;根目录写入当前路径//创建文件树的结点//结点相应内容赋值root->parent=NULL;root->child=binNode;root->sibling_prev=root->sibling_next=NULL;binNode->parent=root;binNode->child=NULL;binNode->sibling_prev=NULL;binNode->sibling_next=usrNode;usrNode->parent=NULL;usrNode->child=libNode;usrNode->sibling_prev=binNode;usrNode->sibling_next=unixNode;unixNode->parent=NULL;unixNode->child=NULL;unixNode->sibling_prev=usrNode;unixNode->sibling_next=ode;ode->parent=NULL;ode->child=NULL;ode->sibling_prev=unixNode;ode->sibling_next=NULL;libNode->parent=usrNode;:..libNode->sibling_prev=NULL;libNode->sibling_next=userNode;userNode->parent=NULL;userNode->child=NULL;userNode->sibling_prev=libNode;userNode->sibling_next=binNode2;binNode2->parent=NULL;binNode2->child=NULL;binNode2->sibling_prev=userNode;binNode2->sibling_next=NULL;liuNode->parent=libNode;liuNode->child=NULL;liuNode->sibling_prev=NULL;liuNode->sibling_next=sunNode;sunNode->parent=NULL;sunNode->child=NULL;sunNode->sibling_prev=liuNode;sunNode->sibling_next=ftiNode;ftiNode->parent=NULL;ftiNode->child=NULL;ftiNode->sibling_prev=sunNode;ftiNode->sibling_next=NULL;}//获取文件或目录名,并把指针指向其父亲结点intFindFilename(charPara2[]){i=strlen(Para2)-1;j=0;while(Para2[i]!='/'&&i>=0){filename[j]=Para2[i];i--;j++;}获得逆序的文件或目录名,存入filename中:..//filename逆转,获得正确的文件或目录名for(i=0;i<strlen(filename)/2;i++,j--){tmp=filename[i];filename[i]=filename[j];filename[j]=tmp;}//查找路径if(strlen(Para2)>0){intsign=FindPath(Para2);if(sign==0)return0;}return1;}//缓冲区安全输入子函数//如果输入超过buffer_len,则截取前buffer_len-1长度的输入,//buffer_len处字符用'/0'代替intGetInput(char*buffer,unsignedintbuffer_len){intcount=0;while(

实验四 文件系统实验报告 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数32
  • 收藏数0 收藏
  • 顶次数0
  • 上传人青山代下
  • 文件大小2.11 MB
  • 时间2024-04-14