2914.模擬文件系統(tǒng)【操作系統(tǒng)課程設(shè)計含報告、源代碼】_第1頁
2914.模擬文件系統(tǒng)【操作系統(tǒng)課程設(shè)計含報告、源代碼】_第2頁
2914.模擬文件系統(tǒng)【操作系統(tǒng)課程設(shè)計含報告、源代碼】_第3頁
2914.模擬文件系統(tǒng)【操作系統(tǒng)課程設(shè)計含報告、源代碼】_第4頁
2914.模擬文件系統(tǒng)【操作系統(tǒng)課程設(shè)計含報告、源代碼】_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、工學(xué)院 操 作 系 統(tǒng) 課程設(shè)計課程設(shè)計說說 明明 書書設(shè)計題目 模擬文件系統(tǒng)的工作 系 別 計算機工程系 專業(yè)班級 學(xué)生姓名 學(xué) 號 指導(dǎo)教師 日 期 2010-5-25 目 錄一、課程設(shè)計題目和目的一、課程設(shè)計題目和目的.1二、課程設(shè)計要求二、課程設(shè)計要求.1三、程序設(shè)計思想三、程序設(shè)計思想.1四、文件系統(tǒng)的實現(xiàn)四、文件系統(tǒng)的實現(xiàn).21.數(shù)據(jù)結(jié)構(gòu)設(shè)計 .22.程序功能圖 .33.實體關(guān)系圖 .34.數(shù)據(jù)流圖 .45.程序流程圖 .5(1) 建立文件:create(文件名,記錄長度) .6(2) 寫文件:write(文件名,開始位置,字符串) .7(3) 讀文件:read(文件名,開始位置,

2、長度) .8(4) 顯示文件所有內(nèi)容 type(文件名) .8(5) 刪除文件 delete(文件名).9(6) 重命名文件 ren(文件名,新文件名).10(7) 查詢文件屬性 ask(文件名).11(8) 關(guān)閉文件 close(文件名).12五、程序運行結(jié)果及分析五、程序運行結(jié)果及分析.13六、課程設(shè)計總結(jié)六、課程設(shè)計總結(jié).15七、參考文七、參考文獻獻.16八、附錄八、附錄.17linlist.hos.cppos.cppseqlist.hseqlist.h工學(xué)院課程設(shè)計用紙第 0 頁 共 58 頁一、課程設(shè)計題目和目的通過模擬文件系統(tǒng)的實現(xiàn),深入理解操作系統(tǒng)中文件系統(tǒng)的理論知識, 加深對教

3、材中的重要算法的理解。同時通過編程實現(xiàn)這些算法,更好地掌握操作系統(tǒng)的原理及實現(xiàn)方法,提高綜合運用各專業(yè)課知識的能力。二、課程設(shè)計要求通過課程設(shè)計,要求學(xué)生主要掌握如下內(nèi)容:1文件的物理結(jié)構(gòu)可以選用順序分配、鏈表分配或索引分配。2建立文件:從命令中得到文件名,得到該文件的文件長度,建立文件。修改目錄表。3刪除文件:回收文件占用的空間,修改目錄表4讀文件:read 文件名 顯示開始字節(jié) 顯示的字節(jié)數(shù) ,直接顯示所需要的字節(jié)數(shù)。5寫文件:write 文件名 插入的位置 插入的內(nèi)容6查詢屬性:顯示文件屬性 文件名,類型,長度,時間等。三、程序設(shè)計思想閱讀操作系統(tǒng)方面的書籍,了解操作系統(tǒng)的文件系統(tǒng)原理。

4、結(jié)合分析課程設(shè)計要求,確定實體以及它們之間的關(guān)系。實體關(guān)系有三張表(磁盤空間分配表、文件表、打開文件表)、一個模擬磁盤的數(shù)組、命令服務(wù)和用戶構(gòu)成。用戶負責輸入命令。命令服務(wù)實現(xiàn)命令的解釋、命令檢查、命令幫助以及調(diào)用相關(guān)模塊執(zhí)行相應(yīng)的命令功能。此課程設(shè)計把 txt 文本作來研究對象來模擬操作系統(tǒng)的文件系統(tǒng)工作過程。所以用一個字符串數(shù)組來模擬磁盤空間,顧名思義,模擬磁盤提供字符的存儲服務(wù)。磁盤空間分配表,采用鏈表結(jié)構(gòu),每個節(jié)點保存模擬磁盤的一個邏輯塊的信息,包括塊的最大長度,文件占用長度,占用標志。如果占用標志為 0,即該空間可分配給文件。初始化磁盤空間分配表鏈表,首先把整個模擬磁盤作來一塊,并置

5、占用位為 0.當有進程申請磁盤空間時,從頭開始遍歷,檢查占用位,如果該塊為可分配,則檢查塊大小,若塊長度大于或等于申請空間大小,則把塊的前一部分(等于申請大?。┓峙浣o文件,并置標志位為占用。剩下的大小作來一個新塊,作來一個新節(jié)點插入到原節(jié)點的后邊,標志位為可用。這樣就實現(xiàn)了模擬磁盤的線性分配。文件表,由于模擬文件系統(tǒng)的文件數(shù)量不多,故文件表采用線性表來存儲。線性表每個結(jié)點存儲一個文件的信息。打開文件表,采用數(shù)組形式存儲打開的文件,數(shù)組每個元素保存一個打開文件的信息。文件信息和文件表中的文件信息類似。構(gòu)造這些實體的關(guān)系圖,數(shù)據(jù)流圖、程序流程圖來進行具體的設(shè)計。工學(xué)院課程設(shè)計用紙第 1 頁 共 5

6、8 頁四、文件系統(tǒng)的實現(xiàn)1.數(shù)據(jù)結(jié)構(gòu)設(shè)計通過分析課程設(shè)計要求,具體設(shè)計出如下數(shù)據(jù)結(jié)構(gòu): char disk10000; /模擬磁盤空間通過一個字符串數(shù)組來模擬磁盤空間,數(shù)組最大長度設(shè)置為 10000,即磁盤空間最大容量為 10000 字節(jié)。作為模擬文件系統(tǒng),主要理解文件系統(tǒng)的原理,可以把文本文件作為對象來研究。故磁盤空間用一個字符串數(shù)組來模擬. struct freedisktable /碰盤空間分配表int start; /開始位置int length; /占用長度int maxlength; /最大長度int useflag; /使用標志,1 為占用,0 為空閑;通過結(jié)構(gòu)體,將磁盤空間使用

7、情況(文件開始位置、占用長度、最大長度、使用標志)結(jié)合在一體。一個結(jié)構(gòu)體變量記錄磁盤一個塊的信息。結(jié)構(gòu)體作為鏈表的一個節(jié)點,設(shè)置一個鏈表將節(jié)點連接起來,構(gòu)成一個磁盤空間分配表。 struct filetable /文件表char filename20; /文件名字int start; /開始位置int length; /文件長度int maxlength; /最大長度char filekind8; /文件種類,此默認為 txtstruct tm *timeinfo; /文件創(chuàng)建時間;通過結(jié)構(gòu)體,將文件名字、文件在磁盤的開始位置、文件長度、文件最大長度、文件類型、創(chuàng)建時間結(jié)合在一起。文件類型,本

8、模擬程序使用 txt 類型。設(shè)置一個線性表來存儲文件。 struct openfiletable / 打開文件表char filename20; /文件名字char filekind8; /文件類型int start; /文件開始位置int length; /文件長度int maxlength; /最大長度int opencount; /打開文件的進程數(shù)struct tm *timeinfo; /文件創(chuàng)建時間;通過結(jié)構(gòu)體存儲打開的文件信息,包括文件名字、文件類型、文件開始位置、文件長度、最大長度、文件打開數(shù)和文件創(chuàng)建時間。通過結(jié)構(gòu)體數(shù)組存儲所有打開文件工學(xué)院課程設(shè)計用紙第 2 頁 共 58 頁

9、信息。2.程序功能圖 模擬文件系統(tǒng)創(chuàng)建文件刪除文件條件讀取寫入文件查詢屬性顯示內(nèi)容顯示目錄重命名文件關(guān)閉文件文件系統(tǒng)提供的文件操作有建立文件(create)、刪除文件(delete)、條件讀取文件(read)、寫入文件(write)、查詢文件的屬性(ask)、顯示文件所有內(nèi)容(type)、重命名文件(ren)、關(guān)閉文件(close)??梢酝ㄟ^鍵盤輸入命令來模擬文件的操作。通過 exit 命令退出程序。3.實體關(guān)系圖 用 戶命令服務(wù)模擬磁盤磁盤空間分配表文件表打開文件表命令服務(wù)使得用戶能夠輸入命令,在需要時提供命令的幫助。同時能夠分析命令,調(diào)用相應(yīng)的命令模塊對模擬磁盤、磁盤空間分配表、文件表、打

10、開文件表進行操作。磁盤空間分配表記錄模擬磁盤的使用情況。文件表記錄文件的信息和在磁盤里的位置等信息。打開文件表記錄已打開的文件,對應(yīng)文件表中的文件信息,和文件表里的文件節(jié)點類似,記錄了文件在模擬磁盤中的信息。工學(xué)院課程設(shè)計用紙第 3 頁 共 58 頁4.數(shù)據(jù)流圖模擬文件系統(tǒng)輸入界面顯示命令幫助文件表打開文件表磁盤分配表模擬磁盤語境級 dfd顯示信息文件信息文件信息長度、位置信息文件(字符串)用戶命令工學(xué)院課程設(shè)計用紙第 4 頁 共 58 頁5.程序流程圖模擬文件系統(tǒng)提供的文件操作有建立(create) ,讀取(read) ,顯示(type) ,刪除(detele) ,寫入(write),關(guān)閉(

11、close),重命名(ren)和查詢(ask)。在模擬程序中可從鍵盤上輸入文件操作命令來模擬各用戶程序中所調(diào)用的各種文件操作,用一個結(jié)束命令(exit)停止程序的執(zhí)行。開始初始化命令表初始化文件表初始化磁盤分配表初始化打開文件表輸入命令命令表中有該命令?分析命令顯示:命令幫助無創(chuàng)建刪除讀取顯示重命名寫入查詢列表關(guān)閉退出程序(exit)執(zhí)行命令執(zhí)行命令工學(xué)院課程設(shè)計用紙第 5 頁 共 58 頁(1) 建立文件:create(文件名,記錄長度)模擬文件系統(tǒng)進行“建立文件”的處理流程如下:工學(xué)院課程設(shè)計用紙第 6 頁 共 58 頁開始查詢文件表文件表中有名字?返回有顯示重命申請磁盤空間空間申請成功?

12、顯示失敗否返回無在磁盤分配表中登記登記:長度=0,最大長度=申請長度,開始位置申請節(jié)點位置空閑情況占用在文件表中登記登記:長度=0,最大長度=建立長度,開始位置分配位置文件類型txt,時間當前時間在打開文件表中登記登記:信息和文件表中類似顯示創(chuàng)建成功返回(2) 寫文件:write(文件名,開始位置,字符串)模擬文件系統(tǒng)進行“建立文件”的處理流程如下:工學(xué)院課程設(shè)計用紙第 7 頁 共 58 頁開始查詢打開文件表查詢文件表在打開文件表里?不在在文件表里?顯示無文件返回不在寫進模擬磁盤在在讀取文件記錄write 參數(shù)合法?合法顯示成功返回顯示參數(shù)非法非法(3) 讀文件:read(文件名,開始位置,長

13、度)模擬文件系統(tǒng)進行“讀取文件”的處理流程如下:工學(xué)院課程設(shè)計用紙第 8 頁 共 58 頁開始查詢文件表在打開文件表里?不在在文件表里?顯示無文件返回不在在在讀取文件記錄read 參數(shù)合法?非法顯示參數(shù)非法返回根據(jù)參數(shù)讀取模擬磁盤里的記錄返回合法(4) 顯示文件所有內(nèi)容 type(文件名)和 readread 方法類似,只不過是在參數(shù)上顯示文件所有內(nèi)容,故不再重復(fù)畫流程圖(5) 刪除文件 delete(文件名)模擬文件系統(tǒng)進行“刪除文件”的處理流程如下:工學(xué)院課程設(shè)計用紙第 9 頁 共 58 頁開始查詢打開文件表顯示被進程占用無法刪除在打開文件表里?在不在在查詢文件表返回在文件表里?顯示無此文

14、件返回不在刪除該文件節(jié)點定位該文件在磁盤分配表中的節(jié)點,置標志為空閑刪除打開文件表中該文件條目返回顯示刪除成功工學(xué)院課程設(shè)計用紙第 10 頁 共 58 頁(6) 重命名文件 ren(文件名,新文件名)模擬文件系統(tǒng)進行“重命名文件”的處理流程如下:返回返回顯示重命名成功返回開始查詢打開文件表顯示被進程占用無法重命名在打開文件表里?在不在在查詢文件表在文件表里?顯示無此文件不在給文件賦新名工學(xué)院課程設(shè)計用紙第 11 頁 共 58 頁(7) 查詢文件屬性 ask(文件名)模擬文件系統(tǒng)進行“查詢文件屬性”的處理流程如下:開始查詢打開文件表顯示文件屬性文件名 ,類型 ,長度打開進程數(shù)創(chuàng)建時間在打開文件表

15、里?在不在返回查詢文件表在文件表里?顯示無此文件返回不在顯示文件屬性文件名,類型,長度,創(chuàng)建時間返回在工學(xué)院課程設(shè)計用紙第 12 頁 共 58 頁(8) 關(guān)閉文件 close(文件名)模擬文件系統(tǒng)進行“關(guān)閉文件”的處理流程如下:開始查詢打開文件表顯示此文件沒有被打開在打開文件表里?不在在返回文件打開數(shù) opencount=0?顯示:計數(shù)器減 1大于0刪除打開文件表中該文件條目顯示刪除成功返回返回工學(xué)院課程設(shè)計用紙第 13 頁 共 58 頁五、程序運行結(jié)果及分析1.程序主界面2.輸入 create ?,顯示命令的幫助3.創(chuàng)建一個長度為 2000 的文件 create what 2000 顯示創(chuàng)建

16、文件成功,并顯示剛創(chuàng)建的文件信息 還有友情提示,create 進程打開了文件 what,需要用 close 命令關(guān)閉4.往文件里寫入內(nèi)容 write what 0 welcome! 顯示成功寫入,用 type 命令顯示剛寫入的內(nèi)容,顯示正確5.繼續(xù)從中間寫入內(nèi)容 write what 3 test,之后用 type 命令顯示內(nèi)容,能得到正確結(jié)果工學(xué)院課程設(shè)計用紙第 14 頁 共 58 頁6.關(guān)閉文件 close what當計數(shù)器為 0,顯示成功關(guān)閉文件,結(jié)果比較滿意7.讀文件 read what 3 4 讀出來 test 字符串,結(jié)果正確8.查詢文件屬性 ask what顯示了 what 文件

17、的屬性,結(jié)果正確,測試成功!對于測試用例,還有很多路徑都有測試過,鑒于篇幅,就不再列出所有可能的路徑來進行白盒測試。工學(xué)院課程設(shè)計用紙第 15 頁 共 58 頁六、課程設(shè)計總結(jié)通過本次的課程設(shè)計,使我能夠正確運用操作系統(tǒng)課程中所學(xué)的基本理論和知識,加深了對文件系統(tǒng)基本概念的理解,以及磁盤文件系統(tǒng)的文件操作。還有讓我感受挺深的是對軟件工程方法的應(yīng)用。設(shè)計一個軟件,先要做好需求分析,這一點很重要,如果沒有分析好需求,到軟件設(shè)計的最后,發(fā)現(xiàn)所做的功能不符合要求,那么一切都得重做,前面所有的努力都付諸東流。還有比較重要的是,寫好 e-r 圖,至少畫出語境級的數(shù)據(jù)流圖,以及仔細畫好程流程圖。在程序設(shè)計的

18、開始,由于分析工作做得不夠深入和細致,吃了點小苦頭。對于這樣一個小設(shè)計來說,都會吃苦頭,要是大工程更是無法想像,有可能會項目失敗。以后得加強對軟件工程的學(xué)習(xí)。另外在運用 c 語言的時候,感覺有點生疏,在組織語言時時而出錯,在編程和調(diào)試的過程中,經(jīng)常會出現(xiàn)意想不到的問題,并非每個問題都可以從相關(guān)資料中找到解決方法,有些問題是無法預(yù)料到的,這就需要通過自己理性的分析得出問題的解決方案。 在設(shè)計過程中,查詢了不少相關(guān)資料,不斷的發(fā)現(xiàn)問題、提出問題、解決問題。在對自己所編寫的源程序段的糾錯的過程中,使我更好的理解了操作系統(tǒng)中文件系統(tǒng)的理論知識,同時在編程時用到了模塊化的設(shè)計思想,這種編程方法可以使我們

19、的編程變的更簡單,可以使我們的查錯與糾錯變的更方便。總的來說通過這次的設(shè)計的學(xué)習(xí)使我學(xué)到了很多在平時的學(xué)習(xí)中學(xué)不到的很多東西,通過這次課程設(shè)計,使我對操作系統(tǒng)和編程產(chǎn)生興趣,我想我會在這條路上繼續(xù)前進下去。我相信,只要不斷的嚴格要求自己,注意培養(yǎng)自己的思維能力,就一定會有更大更輝煌的發(fā)展和提高。工學(xué)院課程設(shè)計用紙第 16 頁 共 58 頁七、參考文獻1美abraham silberschatz peter baer galvin greg gagne 鄭扣根 譯.operating system conceptssixth edition 操作系統(tǒng)概念.高等教育出版社,2004,012(美)r

20、oger s.pressman 著 梅宏 譯.軟件工程-實踐者的研究方法.機械工業(yè)出版社,2002,093蔡啟先.c 語言程序設(shè)計教程(第二版).重慶大學(xué)出版社,2003,074朱戰(zhàn)立.數(shù)據(jù)結(jié)構(gòu).西安電子科技大學(xué)出版社,2003,05工學(xué)院課程設(shè)計用紙第 17 頁 共 58 頁八、附錄1.程序源代碼及注釋/ 編譯工具:visual c+ 6.0 / / 作者:小楚*smill 、藍色的天空 / 郵件: / / 復(fù)制、傳播請保留作者信息,謝謝! / /#include #include #include #include #include void filecreate(char *filena

21、me,int filelenght); /創(chuàng)建文件void filedel(char *filename); /刪除文件void fileread(char *filename,int postion,int lenght);void filewrite(char *filename,int position,char *s); /函數(shù)聲明void fileask(char *filename); /查詢文件屬性void filetype(char *filename); /顯示文件內(nèi)容void fileren(char *filename,char *newname); /重命名文件void

22、 filedir(); /列出所有文件void fileclose(char *filename); /關(guān)閉一個文件int requestdisk(int *startposition,int *maxlength); /分配磁盤空間/模擬磁盤空間char disk10000; /磁盤空間管理 struct freedisktable int start; /開始位置int length; /占用長度int maxlength; /最大長度int useflag; /使用標志,1 為占用,0 為空閑;/工學(xué)院課程設(shè)計用紙第 18 頁 共 58 頁/文件表struct filetablechar

23、 filename20; /文件名字int start; /開始位置int length; /文件長度int maxlength; /最大長度 char filekind8; /文件種類,此默認為 txtstruct tm *timeinfo; /文件創(chuàng)建時間;/打開文件表struct openfiletablechar filename20; /文件名字char filekind8; /文件類型int start; /文件開始位置int length; /文件長度int maxlength; /最大長度int opencount; /打開文件的進程數(shù)struct tm *timeinfo;

24、/文件創(chuàng)建時間;/typedef struct freedisktable lindatatype; /定義鏈表的數(shù)據(jù)類型#include linlist.h /鏈表操作集合slnode *freedisktablehead; /定義磁盤分配表鏈表 頭指針#define maxsize 100 /定義線性表 最大長度typedef struct filetable seqdatatype; /定義線性表數(shù)據(jù)類型#include seqlist.h /線性表操作集合seqlist l; /文件表,模擬文件操作嘛,文件數(shù)不多,故可以用 線性表,簡化操作_struct openfiletable o

25、ft10; /打開文件表數(shù)組int oft_count=0; /打開文件表占用長度void main()struct ordertable /命令表char name8; ;char orderinput30; /存儲用戶輸入的命令字符串char ordername8; /命令名字char filename20; /命令參數(shù) 1,是文件名字char parameter26; /命令參數(shù) 2,是個數(shù)字char parameter330; /命令參數(shù) 3,是字符串或數(shù)字struct ordertable u9; /命令表工學(xué)院課程設(shè)計用紙第 19 頁 共 58 頁int i=0; int flag

26、=0; /用戶輸入串 讀寫位置 標志int flagorder=-1;/ linlistinitiate(&freedisktablehead);/磁盤空間分配鍵表初始化struct freedisktable temp; temp.length=0;temp.maxlength=10000;temp.start=0;temp.useflag=0;if(!linlistinsert(freedisktablehead,0,temp)printf(初始磁盤空閑表失敗!);system(pause);exit(0);/文件表初始化seqlistinitiate(&l); /初始化 文件表/for(

27、i=0;i2;i+) for(int j=0;j2;j+)system(color fc);printf(nnnnnnnnn 計 046 何珠舉 操作系統(tǒng)課程設(shè)計n);for(int k=0;k30000000;k+);system(cls);system(color f3);printf(nnnnnnnnn 計 046 何珠舉 操作系統(tǒng)課程設(shè)計n);for(k=0;k);fflush(stdin); /清空緩沖區(qū)gets(orderinput); /獲取用戶輸入串if(!strcmp(orderinput,exit)exit(0); /當用戶輸入 exit 退出程序system(cls);

28、/清屏for(i=0;orderinputi!= &orderinputi!=0;i+)/以空格為界 分解用戶輸入串ordernamei=orderinputi;flag=i;/保存讀寫指針if(flag6) /命令名長度 小于 6printf(輸入的命令有誤,請重新輸入!n);continue ;ordernamei=0;flagorder=-1; /初始化標志位,flagorder 指明命令在命令表中的位置for(i=0;i9;i+)if(!strcmp(ordername,)flagorder=i; /記錄命令的位置,以便訪問break;if(flagorder=-1)pr

29、intf(你輸入的命令有誤!請重新輸入!n);continue ;工學(xué)院課程設(shè)計用紙第 21 頁 共 58 頁/以空格為界,分解字符串,分解出第一個字符串放到 filename 中for(i=flag+1;orderinputi!= &orderinputi!=0;i+)filenamei-flag-1=orderinputi;filenamei-flag-1=0; /為字符串數(shù)組 置一個結(jié)束標志/flag=i; /下一個字符串 讀寫指針if(!strcmp(filename,?) /顯示命令幫助switch(flagorder)case 0: printf(創(chuàng)建一個文件 格式 create

30、filenamefilelengthn);printf(例如: create a1 1000 ,將創(chuàng)建名為 a1,長度為 1000 字節(jié)的文件n);break;case 1:printf(刪除一個文件 格式 delete filename n);printf(例如: delete a1,將刪除名為 a1 的文件n);break;case 2: printf(讀取一個文件 格式 read filenamepostionlengthn);printf(例如: read a1 8 3,從 a1 文件第 8 個字節(jié)開始,顯示 3 字節(jié)內(nèi)容n);break;case 3:printf(寫一個文件 格式

31、write filenamepostionconten n);printf(例始: write a1 15 test,從 a1 文件第 15 字節(jié)開始寫入 test 字符串n);break;case 4:printf(顯示文件的屬性,格式 ask filenamen); printf(例如 ask a1 ,將顯示文件 a1 的屬性n);break; case 5:printf(顯示文件的所有內(nèi)容,格式 type filenamen);printf(例如 type a1,將顯示文件 a1 的所有內(nèi)容n);break;case 6:printf(重命名一個文件,格式 ren oldfilename

32、newfilenamen);printf(例如 ren a1 b1 ,將 a1 改名為 b1n);break;case 7:工學(xué)院課程設(shè)計用紙第 22 頁 共 58 頁printf(顯示所有文件,例如 dir,將顯示所有文件n);break;case 8:printf(關(guān)閉文件,格式 close filenamen);printf(例如,close a1,將關(guān)閉文件 a1n);break;default:printf(命令錯誤);getch();elseswitch(flagorder)/對相應(yīng)的命令 進行參數(shù)處理case 0:int temp4=1,10,100,1000;int sum=0

33、;int len=0;for(i=flag+1;orderinputi!= &orderinputi!=0;i+)parameter2i-flag-1=orderinputi;parameter2i-flag-1=0; /為字符串數(shù)組 置一個結(jié)束標志flag=i; len=strlen(parameter2); /求字符串數(shù)組的長度for(i=0;ilen;i+) /把第二個參數(shù) 字符串變成整數(shù)sum=sum+(int)parameter2len-i-1-48)*tempi;filecreate(filename,sum); /將命令和參數(shù) 傳給建文件模塊執(zhí)行break;case 1:file

34、del(filename); /刪除文件 break;case 2:int temp4=1,10,100,1000;int sum=0;int len=0;int sum2=0;/for(i=flag+1;orderinputi!= &orderinputi!=0;i+)工學(xué)院課程設(shè)計用紙第 23 頁 共 58 頁parameter2i-flag-1=orderinputi;parameter2i-flag-1=0;flag=i; len=strlen(parameter2); /求字符串數(shù)組的長度for(i=0;ilen;i+) /把第二個參數(shù) 字符串變成整數(shù)sum=sum+(int)par

35、ameter2len-i-1-48)*tempi;/for(i=flag+1;orderinputi!= &orderinputi!=0;i+)parameter3i-flag-1=orderinputi; /把第三個參數(shù)變成整型parameter3i-flag-1=0;flag=i; len=strlen(parameter3);for(i=0;ilen;i+)sum2=sum2+(int)parameter3len-i-1-48)*tempi;fileread(filename,sum,sum2); /調(diào)用讀文件模塊break;case 3:int temp4=1,10,100,1000;

36、int sum=0;int len=0;/for(i=flag+1;orderinputi!= &orderinputi!=0;i+)parameter2i-flag-1=orderinputi;parameter2i-flag-1=0;flag=i; len=strlen(parameter2); /求字符串數(shù)組的長度for(i=0;ilen;i+) /把第二個參數(shù) 字符串變成整數(shù)sum=sum+(int)parameter2len-i-1-48)*tempi;/for(i=flag+1;orderinputi!= &orderinputi!=0;i+)parameter3i-flag-1=

37、orderinputi; /獲取第三個參數(shù),為字符串parameter3i-flag-1=0;flag=i; /filewrite(filename,sum,parameter3); /調(diào)用寫文件模塊工學(xué)院課程設(shè)計用紙第 24 頁 共 58 頁 break;case 4:fileask(filename); /查詢文件屬性break;case 5:filetype(filename); /顯示文件內(nèi)容break;case 6:for(i=flag+1;orderinputi!= &orderinputi!=0;i+)parameter2i-flag-1=orderinputi;paramete

38、r2i-flag-1=0;flag=i; fileren(filename,parameter2);break;case 7:filedir();break;case 8:fileclose(filename);break;default:printf(錯誤!沒有可執(zhí)行的命令);/以上主函數(shù),主函數(shù)進行數(shù)據(jù)結(jié)構(gòu)的定義 分析用戶輸入的命令。/提供命令幫助。把命令和參數(shù),傳遞給執(zhí)行模塊/void filecreate(char *filename,int filelength)/沒有寫到打開文件表int i=0;time_t rawtime;int startposition=0; /文件開始位置

39、,等磁盤分配函數(shù) 返回值int maxlength=filelength;struct filetable temp;for(i=0;il.size;i+)if(!strcmp(filename,l.listi.filename) /判斷是否重名,如果重名直接返回工學(xué)院課程設(shè)計用紙第 25 頁 共 58 頁printf(文件重名,請取別的名字!n);return ; /文件重名,退出創(chuàng)建函數(shù) if(!requestdisk(&startposition,&maxlength)printf(申請磁盤空間失敗!無法建立文件!n);return ; /申請磁盤空間失敗,退出創(chuàng)建函數(shù)strcpy(te

40、mp.filename,filename); strcpy(temp.filekind,txt); /設(shè)置文件類型為 txttemp.length=0; /創(chuàng)建的時候,還沒寫入內(nèi)容,是空文件,長度設(shè)為 0temp.maxlength=filelength; /文件的最大長度temp.start=startposition; /文件的開始位置time(&rawtime); /獲取時間temp.timeinfo=localtime(&rawtime); /把時間寫到結(jié)構(gòu)體里去if(!seqlistinsert(&l,l.size,temp) /把文件 插入到文件表printf(插入文件表失敗!n)

41、;system(pause);exit(0); /把文件插入到 文件表,如果失敗,退出程序printf(成功創(chuàng)建文件!nn);printf(=n);printf(文件名 長度 最大長度 類型 開始位置n);/顯示剛建立的文件printf(%s ,temp.filename);printf(%d ,temp.length);printf(%d ,temp.maxlength);printf(%s ,temp.filekind);printf(%d ,temp.start);printf(n=n);printf(create 進程打開了文件%s,關(guān)閉請用 close 命令!nn,filename)

42、;/寫到打開文件表strcpy(oftoft_count.filename,temp.filename);strcpy(oftoft_count.filekind,temp.filekind);oftoft_count.length=temp.length;oftoft_count.maxlength=temp.maxlength;oftoft_count.start=temp.start;oftoft_count.opencount=1;oftoft_count.timeinfo=temp.timeinfo;oft_count+; /打開表 記錄的是文件數(shù) /printf(count%d,o

43、ft_count);工學(xué)院課程設(shè)計用紙第 26 頁 共 58 頁void filedel(char *filename)int i;int flag=0; int k=0; /記錄文件在 文件表中的位置slnode *p; /磁盤空間分配表 指針seqdatatype x; /存儲被刪除的結(jié)點,無特殊意義for(i=0;ioft_count;i+) /判斷是否被別的進程占用,若被占用,打印出錯,直接返回 if(!strcmp(filename,ofti.filename)printf(別的進程占用文件!無法刪除!);return ;for(i=0;inext!=null;p=p-next)if

44、(p-next-data.start=l.listk.start)p-next-data.useflag=0;printf(成功刪除!n);break;seqlistdelete(&l,k,&x);/從文件表中刪除void fileread(char *filename,int position,int length)工學(xué)院課程設(shè)計用紙第 27 頁 共 58 頁int i;int flag=0;int k=0;for(i=0;ioft_count;i+) /查找文件打開表,如果存在,則不需要再查找文件表if(!strcmp(filename,ofti.filename)k=i;flag=1;o

45、fti.opencount+;/多個進程打開,計算器加 1break;if(flag!=1) /文件不在打開表,找到它,并寫到打開表最后for(i=0;il.size;i+)if(!strcmp(filename,l.listi.filename) /找到文件,寫到文件打開表strcpy(oftoft_count.filename,l.listi.filename);strcpy(oftoft_count.filekind,l.listi.filekind);oftoft_count.length=l.listi.length;oftoft_count.maxlength=l.listi.ma

46、xlength;oftoft_count.start=l.listi.start;oftoft_count.timeinfo=l.listi.timeinfo;oftoft_count.opencount+;k=oft_count;/oft_count=1;/初次打開,賦值為 1flag=1; /標志在打開文件表里if(flag=1)if(positionoftk.length)printf(讀取參數(shù)錯誤,請檢查參數(shù)!n);return ;for(i=0;ilength;i+)printf(%c,diskoftk.start+position+i-1); /讀取內(nèi)容printf(nread 進

47、程打開了文件%s,關(guān)閉請用 close 命令!nn,filename);工學(xué)院課程設(shè)計用紙第 28 頁 共 58 頁void filewrite(char *filename,int position,char *s)/找到文件,寫到打開表,根據(jù)打開表操作int i=0;int len=0; /計算寫入字串長度,跟原來長度相加,如果超過最大長度,就失敗int k=0; /如果在 打開表里打到記錄,則記錄位置int flag=0; /如果 flag=1,說明在打開表里找到了,不用在文件表里找了len=strlen(s);for(i=0;ioft_count;i+)if(!strcmp(filen

48、ame,ofti.filename)k=i;flag=1;ofti.opencount+;/多個進程打開,計算器加 1break;if(flag!=1) /文件不在打開表,找到它,并寫到打開表最后for(i=0;ioftk.maxlength)printf(超過文件最大長度,寫入失敗!n);return ;工學(xué)院課程設(shè)計用紙第 29 頁 共 58 頁else if(positionoftk.length)printf(插入位置非法!請檢查參數(shù)n);return ;elseint j=0;for(i=oftk.length-1;i=oftk.start+position;i-)diski+len

49、=diski; /給插入的字符串 空出位置for(i=oftk.start+position;ioftk.start+position+len;i+,j+)diski=sj; /寫進磁盤for(i=0;il.size;i+) /改變文件長度if(!strcmp(filename,l.listi.filename)l.listi.length=l.listi.length+len; /設(shè)置文件長度break; oftk.length=oftk.length+len; /同時更新打開文件表中文件的長度printf(成功寫入!n);printf(write 進程打開了文件%s,關(guān)閉請用 close

50、命令!nn,filename);elseprintf(無此文件,請輸入正確的文件名!);void fileask(char *filename)int i;int flag=0;for(i=0;ioft_count;i+) /如果在打開表里 找到文件,則不用再找文件表if(!strcmp(filename,ofti.filename)printf(文件名:%sn,ofti.filename);printf(類型:%sn,ofti.filekind);printf(長度:%dn,ofti.length);printf(打開進程數(shù):%dn,ofti.opencount);printf(創(chuàng)建時間:%

51、sn,asctime(ofti.timeinfo);flag=1;break;工學(xué)院課程設(shè)計用紙第 30 頁 共 58 頁if(flag!=1)for(i=0;il.size;i+) /從文件表里查找文件if(!strcmp(filename,l.listi.filename)printf(文件名:%sn,l.listi.filename);printf(類型:%sn,l.listi.filekind);printf(長度:%dn,l.listi.length);printf(創(chuàng)建時間:%sn,asctime(l.listi.timeinfo);flag=1;break;if(flag=0)p

52、rintf(無此文件!n);void filetype(char *filename)int i;int flag=0;int k=0;for(i=0;ioft_count;i+)if(!strcmp(filename,ofti.filename)k=i;flag=1;ofti.opencount+;/多個進程打開,計算器加 1break;if(flag!=1) /文件不在打開表,找到它,并寫到打開表最后for(i=0;il.size;i+)if(!strcmp(filename,l.listi.filename) /找到文件,寫到文件打開表strcmp(oftoft_count.filena

53、me,l.listi.filename);strcmp(oftoft_count.filekind,l.listi.filekind);oftoft_count.length=l.listi.length;oftoft_count.maxlength=l.listi.maxlength;oftoft_count.start=l.listi.start;工學(xué)院課程設(shè)計用紙第 31 頁 共 58 頁oftoft_count.timeinfo=l.listi.timeinfo;oftoft_count.opencount+;k=oft_count;/oft_count=1;/初次打開,賦值為 1fl

54、ag=1; /標志在打開文件表里if(flag=1)for(i=0;ioftk.length;i+)printf(%c,diskoftk.start+i); /顯示全部內(nèi)容if(oftk.length=0)printf(文件為空,無內(nèi)容顯示!n);printf(n=n);printf(ncreate 進程打開了文件%s,關(guān)閉請用 close 命令!nn,filename);/ printf(,n);/ printf(oftk.length %dn,oftk.length);elseprintf(無此文件,請檢查文件名!n);void fileren(char *filename,char *n

55、ewname)int i=0;int flag=0;for(i=0;ioft_count;i+) /若還有別的進程打開文件,剛不能重命名 if(!strcmp(filename,ofti.filename)printf(別的進程占用文件!無法重命名!n);return ;for(i=0;il.size;i+) /在文件表里找到,并重命名if(!strcmp(filename,l.listi.filename)strcpy(l.listi.filename,newname);flag=1;break;if(flag=1)printf(重命名成功!n);elseprintf(重命名失?。o此文件n

56、);工學(xué)院課程設(shè)計用紙第 32 頁 共 58 頁void filedir()int i;if(l.size=0) /文件表的 大小為 0,說明沒有文件printf(磁盤無文件!n);return ;for(i=0;il.size;i+) /打印所有文件名printf(%sn,l.listi.filename); void fileclose(char *filename)int i;int flag=0;int j;for(i=0;ioft_count;i+)if(!strcmp(filename,ofti.filename) /在文件打開表里找到,把打開數(shù)減1, /如果計數(shù)為 0,顯示關(guān)閉成

57、功!ofti.opencount-;flag=1;if(ofti.opencount=0)for(j=i;jnext!=null;p=p-next)k+;/記錄位置,在空閑結(jié)點之后插入結(jié)點if(p-next-data.useflag=0&p-next-data.maxlength=*maxlength)temp.length=0;temp.maxlength=p-next-data.maxlength-*maxlength;temp.start=p-next-data.start+*maxlength;temp.useflag=0; /分解節(jié)點/=p-next-data.maxlength=*

58、maxlength;p-next-data.useflag=1; /設(shè)置分配的空間標志位*startposistion=p-next-data.start;flag=1;/成功分配break; if(1=flag) /成功分配空間,返回成功標志if(!linlistinsert(freedisktablehead,k,temp)printf(失敗!n);system(pause);exit(0);return 1;elsereturn 0;/工學(xué)院課程設(shè)計用紙第 34 頁 共 58 頁linlist.htypedef struct nodelindatatype data;struct nod

59、e *next;slnode;void linlistinitiate(slnode *head) /初始化if(*head=(slnode *)malloc(sizeof(slnode)=null)exit(1);(*head)-next=null;int linlistlength(slnode *head)slnode *p =head;int size=0;while(p-next!=null)p=p-next;size+;return size;int linlistinsert(slnode *head,int i,lindatatype x)slnode *p,*q;int j;p=head;j=-1;while(p-next!=null&jnext;j+;if(j!=i-1)printf(插入位置參數(shù)錯!n);工學(xué)院課程設(shè)計用紙第 35 頁 共 58 頁return 0;if(q=(slnode *)malloc(sizeof(slnode)=null) exit(0);q-data=x;q-next=p-next;p-next=q;return 1;int linlistdelete(slnode *head,int i,lindatatype *x)slnode *p,*s;int j;p=head;j=-1;while(p-next!=null&p-next

溫馨提示

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

評論

0/150

提交評論