1、实习四:文件系统实习一 . 目的要求 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 2、要求设计一个 n 个用户的文件系统,每次用户可保存 m 个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write 等命令。二 . 例题: 1、设计一个 10 个用户的文件系统,每次用户可保存 10 个文件,一次运行用户可以打开 5 个文件。2、程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UED)。另外,为打开文件设置了运行文
2、件目录(AFD)。3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。4、算法与框图: 因系统小,文件目录的检索使用了简单的线性搜索。 文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 程序中使用的主要设计结构如下: 主文件目录和用户文件目录( MFD、UFD) 打开文件目录( AFD )(即运行文件目录)M D F U F D A F D用户名 文件名 打开文件名文件目录指针 保护码 打开保护码用户名 文件长度 读写指针文件目录指针 文件名文件系统算法的流程图如下:实习总结:通过这次实习,更清楚的理解
3、了文件系统的操作,同时也对 C 语言编程进行了巩固。实习代码:#include “string.h“#include “stdio.h“#include “conio.h“#include “stdlib.h“#define L 6 /* 用户最多保存的文件数 */#define N 5 /* 系统可同时管理的用户数*/int U;typedef int SX;/*文件属性 1 为只读,2 为写,3 为可读可写*/typedef int ZT;/*文件状态 1 为建立,2 为打开,3 为关闭*/typedef int FLAG;/*是否空表目,0 为空,1 为非空*/static int me
4、mo128=10,20,30,40,50,60,70,80,90,100,110,120,130,140,150;/*用户文件目录*/struct FCBchar filename20;/*文件名*/SX access;/*文件属性*/int length;/*记录长度*/int address5;/*文件地址*/FLAG flag;/*是否空表目,0 为空*/;/*用户已打开文件表*/struct UOF1char filename20;/*文件名*/SX access;/*文件属性*/int length;/*记录长度*/ZT flag1;/*状态*/int write;/*写指针*/in
5、t read;/*读指针*/FLAG flag;int address5;/*文件地址*/;struct FCB UFDNL =“abc“,2,3,10,20,30,1,“def“,1,3,40,50,60,1,“wj“,3,3,70,80,90,1,“xyz“,1,1,100,1,“aaa“,2,1,110,1,“yyx“,1,1,100,1,“ccb“,1,1,120,1,“ddd“,1,3,40,50,60,1;struct UOF1 UOFNL=“abc“,2,3,2,0,0,1,10,20,30,“ccb“,1,1,2,0,0,1,120;struct MFD1char userna
6、me10;int count;int opencont;struct FCB *userfaddr;struct UOF1 *openfaddr;struct MFD1 MFDN=“A“,3,0,UFD0,UOF0,“B“,2,0,UFD1,UOF1,“C“,2,0,UFD2,UOF2,“D“,1,0,UFD3,UOF3;/*在 UFD 中找空白表项*/selectUFD() int i;struct FCB *P=MFDU.userfaddr;for(i=0;ifilename,name)=0)if(UOFi-flag1=1)UOFi-flag1=3;else if(UOFi-flag1=2
7、)strcpy(noname,UOFi-filename);UOFi-access=0;UOFi-length=0;UOFi-write=0;UOFi-flag=0;printf(“文件成功关闭n“);break;else printf(“文件已经关闭!n“) ;/*CLOSE 已经调试完成!*/*打开文件函数*/void open()char na20;int c;int x,m,j,i;printf(“请输入要打开的文件名 n“);getchar(); gets(na) ;printf(“你想对文件进行写还是读操作?n“);scanf(“%d“, getchar();for(i=0;iwr
8、ite=ade;printf(“写文件成功!n“);break;else /*不是建立状态*/if(UOFUi.access=1)printf(“操作不合法,不能写!n“);break;elseprintf(“是顺序修改吗?1 为顺序,0 为非顺序 1/0?n“);scanf(“%d“,if(n=1)for(e=0;efilename,s)=0)strcpy(noname,UOFi-filename);UOFi-access=0;UOFi-length =0;UOFi-write =0;UOFi-flag=0;strcpy(noname,UFDI-filename);UFDI-access=0
9、;UFDI-length=0;UFDI-address0=0;UFDI-flag=0;printf(“文件不存在,或文件已经撤销!n“);/*显示函数*/void print_UFD()int i ;printf(“num filename access length flag ad1 ad2 ad3 ad4 ad5 n “);for(i=0;i5;i+)printf(“n%dt%st%3dt%3dt%3dt%3dt%3dt%3dt%3dt%3dn“,i,UFDUi.filename,UFDUi.access,UFDUi.length,UFDUi.flag,UFDUi.address0,UFD
10、Ui.address1,UFDUi.address2,UFDUi.address3,UFDUi.address4);void print_UOF()int i;printf(“num filename access length flag write read flag1 n “);for(i=0;i5;i+)printf(“n%1dt%st%dt%dt%dt%dt%dt%dn“,i,UOFUi.filename,UOFUi.access,UOFUi.length,UOFUi.flag,UOFUi.write,UOFUi.read,UOFUi.flag);void main()char nam
11、e20;int i,a;printf(“欢迎使用文件管理系统 .n“);printf(“n 请输入用户名n“) ;LL:scanf(“%s“,name); getchar();for(i=0;iN;i+)if(strcmp(MFDi.username,name)=0)U=i;while(1)printf(“n*欢迎*n“);printf(“1:建立文件操作.n“);printf(“2:打开文件操作.n“);printf(“3:关闭文件操作.n“) ;printf(“4:读文件操作.n“);printf(“5:写文件操作。n“);printf(“6:撤消文件操作n“);printf(“0:结束.
12、n“);printf(“*n“);printf(“n请选择操作命令:n“);scanf(“%d“,switch(a)case 1:creat(); print_UOF();break;case 2: open();break;case 3: close();break;case 4: read();break;case 5: write();break;case 6:delet();break;case 0:exit(0);case 7:printf(“errorn“);default:break;printf(“无此用户n“);printf(“请再次输入用户名!n“);goto LL;实习截图: