操作系统(2)实验四

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

操作系统(2)实验四实验四文件操作与管理一、实验环境VisualC++二、实验目的随着社会信息量的极大增长,要求计算机处理的信息与日俱增,涉及到社会生活的各个方面。因此,文件管理是操作系统的一个极为重要的组成部分。学生应独立地用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解,掌握它们的实施方法,加深理解课堂上讲授过的知识。三、实验要求(1)实际一个n个用户的文件系统,每个用户最多可保存m个文件。(2)限制用户在一次运行中只能打开l个文件。(3)系统应能检查打入命令的正确性,出错要能显示出错原因。(4)对文件必须设置保护措施,如只能执行,允许读、允许写等。在每次打开文件时,根据本次打开的要求,再次设置保护级别,即可有二级保护。(5)对文件的操作至少应有下述几条命令:creat建立文件。delete删除文件。open打开文件。close关闭文件。read读文件。write写文件。四、实验内容(1)本实习设计一个10个用户的文件系统,每个用户最多可保存10个文件,一次运行中用户可打开5个文件。(2)程序采用二级文件目录,即设置了主文件目录(MFD)和用户文件目录(UFD)。前者应包含文件主(即用户)及他们的目录区指针;后者应给出每个文件主占有的文件目录,即文件名,保护码,文件长度以及他们存放的位置等。另外为打开文件设置了运行文件目录(AFD),在文件打开时应填入打开文件号,本次打开保护码和读写指针等。(3)为了便于实现,对文件的读写作了简化,在执行读写命令时,只修改读写指针,并不进行实际文件的读写操作。五、设计思路1.因系统小,文件目录的检索使用了简单的线性搜索,而没有采用Hash等有效算法。2.文件保护简单实用了三位保护码,对应于允许读、允许写和运行执行,如下所示:111允许写允许读允许执行如对应位为0,则不允许。3.程序中使用的主要数据结构如下:①主文件目录和用户文件目录打开文件目录:4.程序框图:六、实验过程1.整个程序运行过程如下:输入用户名—在MFD中查找—显示UFD文件链表—初始化AFD运行文件表—输入操作命令—执行操作命令—保存文件目录—打印文件目录—结束2.MFD、UFD和AFD的结构定义如下:structUFD{stringfilename;intpro[3];intcodel;UFD*next;};structMFD{stringusername;UFD*file;MFD*next;};structAFD{intfilenum;charfilepro[3];UFD*point;AFD*next;};3.voidinit()初始化函数将文件链表变成循环链表,方便执行插入和删除操作。4.intcheckUser()检查用户检查输入的用户名是否在用户文件目录中。5.voidCreate()创建一个文件选择CREATE命令后,查看该用户的UFD链表内是否还有空闲结点:(1)若有则设置该结点的内容,然后打开、修改AFD;(2)若无则报错并退出。6.voidOpen()打开一个文件选择OPEN命令后,输入要打开的文件名,在UFD查找是否有该文件名:(1)若有则打开并修改AFD;(2)若无则报错并退出。7.voidClose()关闭一个文件选择CLOSE命令后,输入需要关闭的文件名,在UFD中搜索是否有该文件名。(1)若无则报错;(2)若有,还要分两种情况:通过检查,该文件并未被打开,则报错存在该文件,且被打开,则正常调用voidClose1(AFD*f),关闭文件。8.voidDelete()删除一个文件选择DELETE命令后,输入需要删除的文件名,在UFD中搜索是否有该文件名:(1)若无则报错;(2)若有,还要分两种情况:通过检查,该文件已被打开,则需要先关闭该文件,确定需要关闭该文件后,通过调用voidClose1(AFD*f),关闭文件,然后删除该文件。存在该文件,且未被打开,则课正常删除该文件,即重新初始化该文件的UDF结点。9.voidRead()读一个文件读文件的关键是保护码的判断。选择了READ命令后,输入需要读的文件名,在UFD中搜索是否有该文件名:(1)若有,但该文件没被打开,则报错;(2)若有,且已被打开,此处要分两种情况:如果保护码的读位为“0”,则不能对该文件进行读操作。否则,就通过文件号来读文件,即通过AFD中的point指针来查找该文件。10.voidWrite()写一个文件写文件的关键也是保护码的判断。选择了WRITE命令后,输入需要读的文件名,在UFD中搜索是否有该文件名:(1)若有,但该文件没被打开,则报错;(2)若有,且已被打开,此处要分两种情况:如果保护码的写位为‘0’,则不能对该文件进行写操作。否则,就可以通过文件号来写文件,即通过AFD中的point指针来查找。11.Bye退出选择了BYE命令后,程序退出并保存当前目录,然后将结果打印出来。程序运行结果1.用户验证2.创建文件3.关闭、打开文件4.删除文件5.读写文件6.退出七、感想体会实验四主要是通过链表来实现对文件的管理的,要求设计一个10个用户的文件系统,每个用户最多可保存10个文件,一次运行中用户可打开5个文件。程序采用了二级文件目录,设置了主文件目录和用户文件目录,另外为打开文件设置了运行文件目录,在文件打开时应填入打开文件号,本次打开保护码和读写指针。在执行各种文件操作命令的时候,需要考虑多种情况,比如读写文件的时候就要考虑文件的保护码,以及该文件是否已被打开的问题;创建命令时要在用户的文件目录中寻找空闲的文件结点,即没有被使用的文件,对其进行文件名、保护码、文件长度的设置;删除命令就要考虑是否有这个文件,再查看此文件是否被打开,如果已经被打开,则要先关闭该文件,在进行删除,删除即对此文件结点进行初始化操作等等。想清楚各项操作的分类情况之后,对每个函数进行编写就容易多了。本次试验模拟了文件的管理操作,虽然只是一个小小的程序,也让我大致了解了计算机对于文件的管理是如何进行的。由于是通过链表的操作实现的,也使我巩固了C++中的链表操作过程。实验源代码:#includeiostream#includecstring#includeiomanipusingnamespacestd;stringa[10]={Carol,Lily,Lucy,Bob,A,B,C,D,E,F};stringcommand[7]={CREATE,DELETE,OPEN,CLOSE,READ,WRITE,BYE};structUFD{stringfilename;intpro[3];intcodel;UFD*next;};structMFD{stringusername;UFD*file;MFD*next;};structAFD{intfilenum;charfilepro[3];UFD*point;AFD*next;};AFD*openfile=NULL;MFD*user=NULL;MFD*thisuser;//当前用户voidinit()//初始化函数{intx=0;for(inti=0;i10;i++){MFD*p;p=newMFD;p-username=a[x];UFD*fhead=NULL;for(intj=0;j10;j++){UFD*q;q=newUFD;q-filename=******;for(inta=0;a3;a++){q-pro[a]=0;}q-codel=0;q-next=fhead;fhead=q;p-file=fhead;if(j==9)//变成循环链表{UFD*r=fhead;while(r-next!=NULL){r=r-next;}r-next=fhead;}}p-next=user;user=p;x++;}//AFD的初始化for(inti=0;i5;i++){AFD*f;f=newAFD;f-filenum=5-i;for(intj=0;j3;j++){f-filepro[j]=0;}f-point=NULL;f-next=openfile;openfile=f;if(i==4)//打开文件链表设为循环链表{AFD*p=openfile;while(p-next!=NULL){p=p-next;}p-next=openfile;}}}intcheckUser(stringusername){MFD*p;for(p=user;p!=NULL;p=p-next){if(p-username==username){break;}}if(p!=NULL){thisuser=p;return1;}else{return0;}}voidshow(){coutYOURFILEDIRECTORYendl;coutsetw(20)setiosflags(ios::left)setfill('')FILENAME;coutsetw(20)setiosflags(ios::left)setfill('')PROTECTION;coutsetw(20)setiosflags(ios::left)setfill('')CODELENGTHendl;MFD*p=thisuser;UFD*q=p-file;for(inti=0;i10;i++){coutsetw(20)setiosflags(ios::left)setfill('')q-filename;coutq-pro[0]q-pro[1]q-pro[2];coutsetw(20)setiosflags(ios::left)setfill('');coutsetw(20)setiosflags(ios::left)setfill('')q-codelendl;q=q-next;}}voidOpenMode(UFD*p,stringname){AFD*f=openfile;inti;for(i=0;i5;i++){if(f-point!=NULL&&f-point-filename==name){coutTHISFILEISALREADYOPENED!endl;return;}f=f-next;}for(i=0;i5;i++){if(f-point==NULL)break;f=f-next;}if(i==5){coutERROR!YOUCAN'TOPENTHISFILE,NUMBERMUST=5!;}else{coutENTERTHEOPENMODE?;stringprotect;cinprotect;intj;for(j=0;j3;j++){if(p-pro[j]!=protect[j]-48)break;}if(j!=3){coutERROR,OPENMODEISWRONG!endl;return;}else{coutTHISFILEISOPENED,ITSOPENNUMBERIS;coutf-filenumendl;f-point=p;for(intj=0;j3;j++){f-filepro[j]=p-pro[j];}}}return;}voidCreate(){coutTHENEWFILESNAME(LESSTHAN9CHARS)?;stringname;cinname;coutTHENEWFILE’SPROTECTIONCODE?;stringprotect;cinprotect;UFD*p=thisuser-file;UFD*q=p;intn;for(n=0;n10;n++){if(q-filename==******)break;q=q-next;}if(n==10){

1 / 31
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功