操作系统2实验四.docx

上传人:b****2 文档编号:12904152 上传时间:2023-04-22 格式:DOCX 页数:17 大小:184.42KB
下载 相关 举报
操作系统2实验四.docx_第1页
第1页 / 共17页
操作系统2实验四.docx_第2页
第2页 / 共17页
操作系统2实验四.docx_第3页
第3页 / 共17页
操作系统2实验四.docx_第4页
第4页 / 共17页
操作系统2实验四.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

操作系统2实验四.docx

《操作系统2实验四.docx》由会员分享,可在线阅读,更多相关《操作系统2实验四.docx(17页珍藏版)》请在冰豆网上搜索。

操作系统2实验四.docx

操作系统2实验四

-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN

 

操作系统

(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++中的链表操作过程。

实验源代码:

#include

#include

#include

usingnamespacestd;

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;<

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!

"<

else

{

OpenMode(q,name);

}

return;

}

voidClose1(AFD*f)

{

f->point=NULL;

for(inti=0;i<3;i++)

{f->filepro[i]=0;}

cout<<"SUCCESS!

THISFILEISCLOSED!

"<

return;

}

voidClose()

{

cout<<"CLOSETHEFILE'SNAME:

";

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!

CAN'TFINDTHISFILE!

"<

else

{

AFD*f=openfile;

inti;

for(i=0;i<5;i++)

{

if(f->point==q)break;

f=f->next;

}

if(n==5){cout<<"ERROR!

THISFILEISNOTOPENED!

"<

else

{

Close1(f);

}

}

return;

}

voidDelete()

{

cout<<"DELETEFILENAME";

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!

CAN'TFINDTHISFILE!

"<

else

{

AFD*f=openfile;

inti;

for(i=0;i<5;i++)

{

if(f->point==q)

{

cout<<"ERROR!

THISFILEISOPENED!

CLOSEDIT(Y/N)"<

chary;

cin>>y;

if(y=='Y'){Close1(f);break;}

elsereturn;

}

f=f->next;

}

q->filename="******";

q->codel=0;

for(intx=0;x<3;x++)

{q->pro[x]=0;}

cout<<"SUCCESS!

THISFILEISBEDELETED!

"<

}

return;

}

voidRead()

{

cout<<"OPENFILENUMBER";

intnum;

cin>>num;

AFD*f=openfile;

inti;

for(i=0;i<5;i++)

{

if(f->filenum==num&&f->point!

=NULL)break;

f=f->next;

}

if(i==5){cout<<"ERROR!

THISFILEISNOTOPENED!

"<

else

{

if(f->filepro[0]==1){cout<<"SUCCESS!

READING!

"<

else{cout<<"ERROR!

THISFILECAN'TREADWITHREADINGRIGHTLIMITED!

"<

}

return;

}

voidWrite()

{

cout<<"OPENFILENUMBER";

intnum;

cin>>num;

AFD*f=openfile;

inti;

for(i=0;i<5;i++)

{

if(f->filenum==num&&f->point!

=NULL)break;

f=f->next;

}

if(i==5){cout<<"ERROR!

THISFILEISNOTOPENED!

"<

else

{

if(f->filepro[1]==1)

{

cout<<"HOWMANYCHARACTERSTOBEWRITTENINTOTHATFILE";

intcode;

cin>>code;

f->point->codel=code;

}

else{cout<<"ERROR!

THISFILECAN'TWRITEWITHWRITINGRIGHTLIMITED!

"<

}

return;

}

voidFileWork(intcom)

{

if(com==1){Create();}<

}

show();

intcom=0;

while(com!

=7)

{

cout<<"COMMANDNAME";

strings;

cin>>s;

inti;

for(i=0;i<7;i++)

{

if(s==command[i]){com=i+1;break;}

}

if(i==7)

{

cout<<"COMMANDNAMEGIVENISWRONG!

"<

cout<<"ITSHOULDBEONEOFFOLLOWING:

"<

cout<<"CREATE,DELETE,OPEN,CLOSE,READ,WRITE,BYE.TRYAGAIN"<

continue;

}

else{FileWork(com);}

}

return0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1