操作系統(tǒng)(2)實(shí)驗(yàn)四_第1頁(yè)
操作系統(tǒng)(2)實(shí)驗(yàn)四_第2頁(yè)
操作系統(tǒng)(2)實(shí)驗(yàn)四_第3頁(yè)
操作系統(tǒng)(2)實(shí)驗(yàn)四_第4頁(yè)
操作系統(tǒng)(2)實(shí)驗(yàn)四_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 SHANGHAI UNIVERSITY<操作系統(tǒng)>實(shí)驗(yàn)報(bào)告學(xué) 院計(jì)算機(jī)工程與科學(xué)學(xué)院學(xué)號(hào)10122050姓名王杰指導(dǎo)老師張建日期2014.03.07實(shí)驗(yàn)四 文件操作與管理一、實(shí)驗(yàn)環(huán)境Visual C+二、實(shí)驗(yàn)?zāi)康?隨著社會(huì)信息量的極大增長(zhǎng),要求計(jì)算機(jī)處理的信息與日俱增,涉及到社會(huì)生活的各個(gè)方面。因此,文件管理是操作系統(tǒng)的一個(gè)極為重要的組成部分。學(xué)生應(yīng)獨(dú)立地用高級(jí)語(yǔ)言編寫和調(diào)試一個(gè)簡(jiǎn)單的文件系統(tǒng),模擬文件管理的工作過(guò)程。從而對(duì)各種文件操作命令的實(shí)質(zhì)內(nèi)容和執(zhí)行過(guò)程有比較深入的了解,掌握它們的實(shí)施方法,加深理解課堂上講授過(guò)的知識(shí)。三、實(shí)驗(yàn)要求(1)實(shí)際一個(gè)n個(gè)用戶的文件系統(tǒng),每個(gè)用戶最

2、多可保存 m個(gè)文件。 (2)限制用戶在一次運(yùn)行中只能打開 l個(gè)文件。 (3)系統(tǒng)應(yīng)能檢查打入命令的正確性,出錯(cuò)要能顯示出錯(cuò)原因。 (4)對(duì)文件必須設(shè)置保護(hù)措施,如只能執(zhí)行,允許讀、允許寫等。在每次打開文件時(shí),根據(jù)本次打開的要求,再次設(shè)置保護(hù)級(jí)別,即可有二級(jí)保護(hù)。 (5)對(duì)文件的操作至少應(yīng)有下述幾條命令: creat 建立文件。 delete 刪除文件。 open 打開文件。 close 關(guān)閉文件。 read 讀文件。 write 寫文件。四、實(shí)驗(yàn)內(nèi)容(1)本實(shí)習(xí)設(shè)計(jì)一個(gè) 10 個(gè)用戶的文件系統(tǒng),每個(gè)用戶最多可保存 10 個(gè)文件,一次運(yùn)行中用戶可打開 5 個(gè)文件。 (2)程序采用二級(jí)文件目錄,即

3、設(shè)置了主文件目錄(MFD)和用戶文件目錄(UFD)。前者應(yīng)包含文件主(即用戶)及他們的目錄區(qū)指針;后者應(yīng)給出每個(gè)文件主占有的文件目錄,即文件名,保護(hù)碼,文件長(zhǎng)度以及他們存放的位置等。另外為打開文件設(shè)置了運(yùn)行文件目錄(AFD),在文件打開時(shí)應(yīng)填入打開文件號(hào),本次打開保護(hù)碼和讀寫指針等。 (3)為了便于實(shí)現(xiàn),對(duì)文件的讀寫作了簡(jiǎn)化,在執(zhí)行讀寫命令時(shí),只修改讀寫指針,并不進(jìn)行實(shí)際文件的讀寫操作。五、設(shè)計(jì)思路1. 因系統(tǒng)小,文件目錄的檢索使用了簡(jiǎn)單的線性搜索,而沒有采用Hash等有效算法。 2. 文件保護(hù)簡(jiǎn)單實(shí)用了三位保護(hù)碼,對(duì)應(yīng)于允許讀、允許寫和運(yùn)行執(zhí)行,如下所示: 1 1 1 允許寫 允許讀 允許執(zhí)

4、行 如對(duì)應(yīng)位為 0,則不允許。 3. 程序中使用的主要數(shù)據(jù)結(jié)構(gòu)如下: 主文件目錄和用戶文件目錄 打開文件目錄: 4. 程序框圖: 六、實(shí)驗(yàn)過(guò)程1. 整個(gè)程序運(yùn)行過(guò)程如下:輸入用戶名>在MFD中查找>顯示UFD文件鏈表>初始化AFD運(yùn)行文件表>輸入操作命令>執(zhí)行操作命令>保存文件目錄>打印文件目錄>結(jié)束2. MFD、UFD和AFD的結(jié)構(gòu)定義如下:struct UFD string filename;int pro3;int codel;UFD *next;struct MFD string username;UFD *file;MFD *next;

5、struct AFD int filenum;char filepro3;UFD *point;AFD *next;3. void init( ) 初始化函數(shù)將文件鏈表變成循環(huán)鏈表,方便執(zhí)行插入和刪除操作。4. int checkUser( ) 檢查用戶檢查輸入的用戶名是否在用戶文件目錄中。5. void Create ( ) 創(chuàng)建一個(gè)文件選擇CREATE命令后,查看該用戶的UFD鏈表內(nèi)是否還有空閑結(jié)點(diǎn):(1) 若有則設(shè)置該結(jié)點(diǎn)的內(nèi)容,然后打開、修改AFD;(2) 若無(wú)則報(bào)錯(cuò)并退出。6. void Open( ) 打開一個(gè)文件選擇OPEN命令后,輸入要打開的文件名,在UFD查找是否有該文件名:

6、(1) 若有則打開并修改AFD;(2) 若無(wú)則報(bào)錯(cuò)并退出。7. void Close( ) 關(guān)閉一個(gè)文件選擇CLOSE命令后,輸入需要關(guān)閉的文件名,在UFD中搜索是否有該文件名。(1) 若無(wú)則報(bào)錯(cuò);(2) 若有,還要分兩種情況:l 通過(guò)檢查,該文件并未被打開,則報(bào)錯(cuò)l 存在該文件,且被打開,則正常調(diào)用void Close1(AFD *f),關(guān)閉文件。8. void Delete( ) 刪除一個(gè)文件選擇DELETE命令后,輸入需要?jiǎng)h除的文件名,在UFD中搜索是否有該文件名:(1) 若無(wú)則報(bào)錯(cuò);(2) 若有,還要分兩種情況:l 通過(guò)檢查,該文件已被打開,則需要先關(guān)閉該文件,確定需要關(guān)閉該文件后,通

7、過(guò)調(diào)用void Close1(AFD *f),關(guān)閉文件,然后刪除該文件。l 存在該文件,且未被打開,則課正常刪除該文件,即重新初始化該文件的UDF結(jié)點(diǎn)。9. void Read( ) 讀一個(gè)文件讀文件的關(guān)鍵是保護(hù)碼的判斷。選擇了READ命令后,輸入需要讀的文件名,在UFD中搜索是否有該文件名:(1) 若有,但該文件沒被打開,則報(bào)錯(cuò);(2) 若有,且已被打開,此處要分兩種情況:l 如果保護(hù)碼的讀位為“0”,則不能對(duì)該文件進(jìn)行讀操作。l 否則,就通過(guò)文件號(hào)來(lái)讀文件,即通過(guò)AFD中的point指針來(lái)查找該文件。10. void Write( ) 寫一個(gè)文件寫文件的關(guān)鍵也是保護(hù)碼的判斷。選擇了WRIT

8、E命令后,輸入需要讀的文件名,在UFD中搜索是否有該文件名:(1) 若有,但該文件沒被打開,則報(bào)錯(cuò);(2) 若有,且已被打開,此處要分兩種情況:l 如果保護(hù)碼的寫位為0,則不能對(duì)該文件進(jìn)行寫操作。l 否則,就可以通過(guò)文件號(hào)來(lái)寫文件,即通過(guò)AFD中的point指針來(lái)查找。11. Bye 退出選擇了BYE命令后,程序退出并保存當(dāng)前目錄,然后將結(jié)果打印出來(lái)。程序運(yùn)行結(jié)果1. 用戶驗(yàn)證2. 創(chuàng)建文件3. 關(guān)閉、打開文件4. 刪除文件5. 讀寫文件6. 退出七、感想體會(huì)實(shí)驗(yàn)四主要是通過(guò)鏈表來(lái)實(shí)現(xiàn)對(duì)文件的管理的,要求設(shè)計(jì)一個(gè) 10 個(gè)用戶的文件系統(tǒng),每個(gè)用戶最多可保存 10 個(gè)文件,一次運(yùn)行中用戶可打開

9、5 個(gè)文件。程序采用了二級(jí)文件目錄,設(shè)置了主文件目錄和用戶文件目錄,另外為打開文件設(shè)置了運(yùn)行文件目錄,在文件打開時(shí)應(yīng)填入打開文件號(hào),本次打開保護(hù)碼和讀寫指針。在執(zhí)行各種文件操作命令的時(shí)候,需要考慮多種情況,比如讀寫文件的時(shí)候就要考慮文件的保護(hù)碼,以及該文件是否已被打開的問(wèn)題;創(chuàng)建命令時(shí)要在用戶的文件目錄中尋找空閑的文件結(jié)點(diǎn),即沒有被使用的文件,對(duì)其進(jìn)行文件名、保護(hù)碼、文件長(zhǎng)度的設(shè)置;刪除命令就要考慮是否有這個(gè)文件,再查看此文件是否被打開,如果已經(jīng)被打開,則要先關(guān)閉該文件,在進(jìn)行刪除,刪除即對(duì)此文件結(jié)點(diǎn)進(jìn)行初始化操作等等。想清楚各項(xiàng)操作的分類情況之后,對(duì)每個(gè)函數(shù)進(jìn)行編寫就容易多了。本次試驗(yàn)?zāi)M了

10、文件的管理操作,雖然只是一個(gè)小小的程序,也讓我大致了解了計(jì)算機(jī)對(duì)于文件的管理是如何進(jìn)行的。由于是通過(guò)鏈表的操作實(shí)現(xiàn)的,也使我鞏固了C+中的鏈表操作過(guò)程。實(shí)驗(yàn)源代碼:#include<iostream>#include<cstring>#include <iomanip>using namespace std;string a10="Carol","Lily","Lucy","Bob","A","B","C","

11、D","E","F"string command7="CREATE","DELETE","OPEN","CLOSE","READ","WRITE","BYE"struct UFDstring filename;int pro3;int codel;UFD *next;struct MFDstring username;UFD *file;MFD *next;struct AFDint filenum;cha

12、r filepro3;UFD *point;AFD *next;AFD *openfile=NULL;MFD *user=NULL;MFD *thisuser; /當(dāng)前用戶void init() /初始化函數(shù)int x=0;for(int i=0;i<10;i+)MFD *p;p=new MFD; p->username=ax;UFD *fhead=NULL;for(int j=0;j<10;j+)UFD *q;q=new UFD;q->filename="*"for(int a=0;a<3;a+)q->proa=0;q->code

13、l=0; q->next=fhead;fhead=q;p->file=fhead;if(j=9) /變成循環(huán)鏈表UFD *r=fhead;while(r->next!=NULL)r=r->next;r->next=fhead;p->next=user;user=p;x+;/AFD的初始化for(int i=0;i<5;i+)AFD *f;f=new AFD;f->filenum=5-i;for(int j=0;j<3;j+)f->fileproj=0;f->point=NULL;f->next=openfile;openf

14、ile=f;if(i=4) /打開文件鏈表設(shè)為循環(huán)鏈表AFD *p=openfile;while(p->next!=NULL)p=p->next;p->next=openfile;int checkUser(string username)MFD *p;for(p=user;p!=NULL;p=p->next)if(p->username=username)break;if(p!=NULL)thisuser=p;return 1; elsereturn 0;void show()cout<<"YOUR FILE DIRECTORY"

15、<<endl;cout<<setw(20)<<setiosflags(ios:left)<<setfill(' ')<<"FILE NAME"cout<<setw(20)<<setiosflags(ios:left)<<setfill(' ')<<"PROTECTION"cout<<setw(20)<<setiosflags(ios:left)<<setfill(' 

16、9;)<<"CODE LENGTH"<<endl;MFD *p=thisuser;UFD *q=p->file;for(int i=0;i<10;i+)cout<<setw(20)<<setiosflags(ios:left)<<setfill(' ')<<q->filename;cout<<q->pro0<<q->pro1<<q->pro2;cout<<setw(20)<<setiosfla

17、gs(ios:left)<<setfill(' ')<<" "cout<<setw(20)<<setiosflags(ios:left)<<setfill(' ')<<q->codel<<endl;q=q->next;void OpenMode(UFD *p,string name)AFD *f=openfile;int i;for(i=0;i<5;i+)if(f->point!=NULL&&f->point-&g

18、t;filename=name)cout<<"THIS FILE IS ALREADY OPENED!"<<endl;return;f=f->next;for(i=0;i<5;i+)if(f->point=NULL)break;f=f->next;if(i=5)cout<<"ERROR!YOU CAN'T OPEN THIS FILE,NUMBER MUST <=5!"elsecout<<"ENTER THE OPEN MODE? "string p

19、rotect;cin>>protect;int j;for(j=0;j<3;j+)if(p->proj!=protectj-48)break;if(j!=3)cout<<"ERROR,OPEN MODE IS WRONG!"<<endl;return;elsecout<<"THIS FILE IS OPENED,ITS OPEN NUMBER IS "cout<<f->filenum<<endl;f->point=p;for(int j=0;j<3;j+

20、)f->fileproj=p->proj; return;void Create()cout<<"THE NEW FILE S NAME(LESS THAN 9 CHARS)? "string name;cin>>name;cout<<"THE NEW FILES PROTECTION CODE? "string protect;cin>>protect;UFD *p=thisuser->file;UFD *q=p;int n;for(n=0;n<10;n+)if(q->fil

21、ename="*")break;q=q->next;if(n=10)cout<<"CREAT FAILED!THERE IS NO SPACE,FILE NUMBER MUST<=10!"<<endl;return;elseq->filename=name;for(int i=0;i<3;i+)q->proi=protecti-48; cout<<"THE NEW FILE IS CREATED."<<endl;OpenMode(q,name);return

22、 ;void Open()cout<<"FILE NAME TO BE OPENED? "string name;cin>>name;UFD *p=thisuser->file;UFD *q=p;int n;for(n=0;n<10;n+)if(q->filename=name)break;q=q->next;if(n=10)cout<<"ERROR!THIS FILE IS NOT EXISTS!"<<endl;return;elseOpenMode(q,name);return

23、;void Close1(AFD *f)f->point=NULL;for(int i=0;i<3;i+)f->fileproi=0;cout<<"SUCCESS!THIS FILE IS CLOSED!"<<endl;return;void Close()cout<<"CLOSE THE FILE'S NAME: "string name;cin>>name;UFD *p=thisuser->file;UFD *q=p;int n;for(n=0;n<10;n+)if

24、(q->filename=name)break;q=q->next;if(n=10)cout<<"ERROR!CAN'T FIND THIS FILE!"<<endl;return;elseAFD *f=openfile; int i; for(i=0;i<5;i+)if(f->point=q)break;f=f->next;if(n=5)cout<<"ERROR!THIS FILE IS NOT OPENED!"<<endl;return;elseClose1(f);

25、return;void Delete()cout<<"DELETE FILENAME? "string name;cin>>name;UFD *p=thisuser->file;UFD *q=p;int n;for(n=0;n<10;n+)if(q->filename=name)break;q=q->next;if(n=10)cout<<"ERROR!CAN'T FIND THIS FILE!"<<endl;return;elseAFD *f=openfile;int i;

26、for(i=0;i<5;i+)if(f->point=q)cout<<"ERROR!THIS FILE IS OPENED! CLOSED IT?(Y/N)"<<endl;char y;cin>>y;if(y='Y')Close1(f);break;else return;f=f->next;q->filename="*"q->codel=0;for(int x=0;x<3;x+)q->prox=0;cout<<"SUCCESS!THIS

27、FILE IS BE DELETED! "<<endl;return;void Read()cout<<"OPEN FILE NUMBER? "int num;cin>>num;AFD *f=openfile;int i;for(i=0;i<5;i+)if(f->filenum=num&&f->point!=NULL)break;f=f->next;if(i=5)cout<<"ERROR!THIS FILE IS NOT OPENED!"<<en

28、dl;return;elseif(f->filepro0=1)cout<<"SUCCESS!READING!"<<endl;elsecout<<"ERROR!THIS FILE CAN'T READ WITH READING RIGHT LIMITED!"<<endl;return;void Write()cout<<"OPEN FILE NUMBER? "int num;cin>>num;AFD *f=openfile;int i;for(i=0;

29、i<5;i+)if(f->filenum=num&&f->point!=NULL)break;f=f->next;if(i=5)cout<<"ERROR!THIS FILE IS NOT OPENED!"<<endl;return;elseif(f->filepro1=1)cout<<"HOW MANY CHARACTERS TO BE WRITTEN INTO THAT FILE? "int code;cin>>code;f->point->codel=code;elsecout<<"ERROR!THIS FILE CAN'T WRITE WITH WRITING RIGHT LIMITED!"<<endl;retur

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論