操作系统实验四Word下载.docx
《操作系统实验四Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验四Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
前者应包含文件主(即用户)及他们的目录区指针;
后者应给出每个文件主占有的文件目录,即文件名,保护码,文件长度以及他们存放的位置等。
另外为打开文件设置了运行文件目录(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;
7.voidClose()关闭一个文件
选择CLOSE命令后,输入需要关闭的文件名,在UFD中搜索是否有该文件名。
(1)若无则报错;
(2)若有,还要分两种情况:
通过检查,该文件并未被打开,则报错
存在该文件,且被打开,则正常调用voidClose1(AFD*f),关闭文件。
8.voidDelete()删除一个文件
选择DELETE命令后,输入需要删除的文件名,在UFD中搜索是否有该文件名:
通过检查,该文件已被打开,则需要先关闭该文件,确定需要关闭该文件后,通过调用voidClose1(AFD*f),关闭文件,然后删除该文件。
存在该文件,且未被打开,则课正常删除该文件,即重新初始化该文件的UDF结点。
9.voidRead()读一个文件
读文件的关键是保护码的判断。
选择了READ命令后,输入需要读的文件名,在UFD中搜索是否有该文件名:
(1)若有,但该文件没被打开,则报错;
(2)若有,且已被打开,此处要分两种情况:
如果保护码的读位为“0”,则不能对该文件进行读操作。
否则,就通过文件号来读文件,即通过AFD中的point指针来查找该文件。
10.voidWrite()写一个文件
写文件的关键也是保护码的判断。
选择了WRITE命令后,输入需要读的文件名,在UFD中搜索是否有该文件名:
如果保护码的写位为‘0’,则不能对该文件进行写操作。
否则,就可以通过文件号来写文件,即通过AFD中的point指针来查找。
11.Bye退出
选择了BYE命令后,程序退出并保存当前目录,然后将结果打印出来。
程序运行结果
1.用户验证
2.创建文件
3.关闭、打开文件
4.删除文件
5.读写文件
6.退出
七、感想体会
实验四主要是通过链表来实现对文件的管理的,要求设计一个10个用户的文件系统,每个用户最多可保存10个文件,一次运行中用户可打开5个文件。
程序采用了二级文件目录,设置了主文件目录和用户文件目录,另外为打开文件设置了运行文件目录,在文件打开时应填入打开文件号,本次打开保护码和读写指针。
在执行各种文件操作命令的时候,需要考虑多种情况,比如读写文件的时候就要考虑文件的保护码,以及该文件是否已被打开的问题;
创建命令时要在用户的文件目录中寻找空闲的文件结点,即没有被使用的文件,对其进行文件名、保护码、文件长度的设置;
删除命令就要考虑是否有这个文件,再查看此文件是否被打开,如果已经被打开,则要先关闭该文件,在进行删除,删除即对此文件结点进行初始化操作等等。
想清楚各项操作的分类情况之后,对每个函数进行编写就容易多了。
本次试验模拟了文件的管理操作,虽然只是一个小小的程序,也让我大致了解了计算机对于文件的管理是如何进行的。
由于是通过链表的操作实现的,也使我巩固了C++中的链表操作过程。
实验源代码:
#include<
iostream>
cstring>
#include<
iomanip>
usingnamespacestd;
stringa[10]={"
Carol"
"
Lily"
Lucy"
Bob"
A"
B"
C"
D"
E"
F"
stringcommand[7]={"
CREATE"
DELETE"
OPEN"
CLOSE"
READ"
WRITE"
BYE"
structUFD
structMFD
structAFD
AFD*openfile=NULL;
MFD*user=NULL;
MFD*thisuser;
<
<
endl;
OpenMode(q,name);
return;
}
voidOpen()
cout<
"
FILENAMETOBEOPENED"
;
stringname;
cin>
>
name;
UFD*p=thisuser->
file;
UFD*q=p;
intn;
for(n=0;
n<
10;
n++)
{
if(q->
filename==name)break;
q=q->
next;
}
if(n==10){cout<
ERROR!
THISFILEISNOTEXISTS!
return;
else
OpenMode(q,name);
voidClose1(AFD*f)
f->
point=NULL;
for(inti=0;
i<
3;
i++)
{f->
filepro[i]=0;
SUCCESS!
THISFILEISCLOSED!
return;
voidClose()
CLOSETHEFILE'
SNAME:
"
CAN'
TFINDTHISFILE!
AFD*f=openfile;
inti;
for(i=0;
5;
{
if(f->
point==q)break;
f=f->
}
if(n==5){cout<
THISFILEISNOTOPENED!
}\
else
Close1(f);
voidDelete()
DELETEFILENAME"
inti;
point==q)
{
cout<
THISFILEISOPENED!
CLOSEDIT(Y/N)"
chary;
cin>
y;
if(y=='
Y'
){Close1(f);
break;
elsereturn;
}
q->
filename="
******"
codel=0;
for(intx=0;
x<
x++)
{q->
pro[x]=0;
cout<
THISFILEISBEDELETED!
voidRead()
OPENFILENUMBER"
intnum;
num;
AFD*f=openfile;
if(f->
filenum==num&
&
f->
point!
=NULL)break;
f=f->
if(i==5){cout<
filepro[0]==1){cout<
READING!
else{cout<
THISFILECAN'
TREADWITHREADINGRIGHTLIMITED!
voidWrite()
filepro[1]==1)
cout<
HOWMANYCHARACTERSTOBEWRITTENINTOTHATFILE"
intcode;
cin>
code;
f->
point->
codel=code;
TWRITEWITHWRITINGRIGHTLIMITED!
voidFileWork(intcom)
if(com==1){Create();
}<
show();
intcom=0;
while(com!
=7)
COMMANDNAME"
strings;
cin>
s;
for(i=0;
7;
if(s==command[i]){com=i+1;
if(i==7)
COMMANDNAMEGIVENISWRONG!
ITSHOULDBEONEOFFOLLOWING:
CREATE,DELETE,OPEN,CLOSE,READ,WRITE,BYE.TRYAGAIN"
continue;
else{FileWork(com);
return0;