一 . 目的要求
. 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。
二 . 例题:
设计一个N个用户的文件系统,每次用户可保存L个文件,一次运行用户可以打开S个文件。
程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UFD)。另外,为打开文件设置了运行文件目录,用户已打开文件表UOF.。
为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作
算法与框图:
因系统小,文件目录的检索使用了简单的线性搜索。
文件保护简单使用了保护码:允许读写执行、对应位为 1,对应位为2,和对应位为3。
程序中使用的主要设计结构如下:
主文件目录和用户文件目录( MFD、UFD)
打开文件目录( UOF)(即运行文件目录)
主文件目录MFD:
用户名 | 用户文件数 | 用户已打开文件数 | 用户文件目录地址 | 用户已打开文件目录地址 |
A | ||||
B | ||||
C | ||||
D |
文件名 | 文件属性 | 记录长度 | 文件地址 | 标志(是否空表目) | |
文件名 | 文件属性 | 记录长度 | 状态(打开/建立) | 读指针 | 写指针 | 标志(是否空表目) |
显示初始的文件目录表、输入的文件操作命令和每条命令执行后的UOF文件,程序运行后打印所有用户的文件目录表。
假定文件系统提供的文件操作有建立文件(CREATE),打开文件(OPEN),关闭文件(CLOSE),读文件(READ),写文件(WRITE)和删除文件(DELETE),在模拟程序中可以从键盘上输入文件操作命令来模拟各用户程序中所调用的各种文件操作,用一个结束命令(end)停止程序执行。主程序结构流图如下:
用输入命令来模拟用户程序中调用的文件操作,这些命令的格式和和要求如下:①建立文件:create(文件名,文件长度,文件属性)
②写文件:write(文件名,记录号)
有两种情况,第一种是在执行create后要求写,第二种是在执行open后要求写,即对一个已存在的文件进行修改。
③关闭文件:close(文件名),对某个文件不需要再读或写时,用户应关闭文件。
④打开文件:open(文件名,操作类型),其中操作类型指出文件打开后,用户将对文件进行读或写。约定操作类型与文件属性不符合或正处于“建立”状态的文件不允许打开。
⑤读文件:read(文件名,读长度),由于文件采用索引,可顺序读,也可随机读,自行设计流图。
⑥删除文件 delete(文件名),从相应的用户文件目录UFD中将文件控制块删除,收回该文件占用的存储区域。自行设计流程。
#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 memo[128]={10,20,30,40,50,60,70,80,90,100,110,120,130,140,150};
/*用户文件目录*/
struct FCB
{
char filename[20];/*文件名*/
SX access;/*文件属性*/
int length;/*记录长度*/
int address[5];/*文件地址*/
FLAG flag;/*是否空表目,0为空*/
};
/*用户已打开文件表*/
struct UOF1
{
char filename[20];/*文件名*/
SX access;/*文件属性*/
int length;/*记录长度*/
ZT flag1;/*状态*/
int write;/*写指针*/
int read;/*读指针*/
FLAG flag;
int address[5];/*文件地址*/
};
struct FCB UFD[N][L] ={{{"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 UOF[N][L]={{"abc",2,3,2,0,0,1,{10,20,30}},{"ccb",1,1,2,0,0,1,{120}}};
struct MFD1
{char username[10];
int count;
int opencont;
struct FCB *userfaddr;
struct UOF1 *openfaddr;
};
struct MFD1 MFD[N]={"A",3,0,UFD[0],UOF[0],"B",2,0,UFD[1],UOF[1],"C",2,0,UFD[2],UOF[2],"D",1,0,UFD[3],UOF[3]};
/*在UFD中找空白表项*/
selectUFD()
{ int i;
struct FCB *P=MFD[U].userfaddr;
for(i=0;i if(i selectUOF() { int j; struct UOF1 *P=MFD[U].openfaddr; for(j=0;j if(j void creat(/*char filename[],int L,SX access*/) { struct FCB *P=MFD[U].userfaddr; int I,J; int j,le,address; char s[20]; char ac; printf("请输入文件名\\n"); scanf("%s",s); for(j=0;j { printf("有同名文件,不能创建!\\n"); break; } if(j==L) { printf("文件长度:\\n"); scanf("%d",&le); getchar(); printf("文件属性:\\n"); scanf("%d",&ac); getchar(); I=selectUFD(); J=selectUOF();/*找空登记项,*/ strcpy(UFD[U][I].filename,s); UFD[U][I].length=le; UFD[U][I].access=ac; UFD[U][I].flag=1; strcpy(UOF[U][J].filename,s); UOF[U][J].length=le; UOF[U][J].access=ac; UOF[U][J].flag=1; printf("请输入第一个地址\\n"); scanf("%d",&address); for(j=0;j<128;j++) { if(memo[j]==0) { memo[j]=address; break; } } UFD[U][I].address[0]=address; UOF[U][J].flag1=1; UOF[U][J].write=address; MFD[U].count++; MFD[U].opencont++; printf("\\n文件创建成功!\\n"); } } /*以上已调试完成!20101115*/ /*关闭文件函数*/ void close() { int i; char name[20]; char noname[20]="00000000"; printf("请输入文件名:\\n"); scanf("%s",name); for(i=0;i if(UOF[i]->flag1==1) {UOF[i]->flag1=3;} else if(UOF[i]->flag1==2) {strcpy(noname,UOF[i]->filename); UOF[i]->access=0; UOF[i]->length=0; UOF[i]->write=0; UOF[i]->flag=0; printf("文件成功关闭\\n");break; } else printf("文件已经关闭!\\n") ; } /*CLOSE 已经调试完成!*/ /*打开文件函数*/ void open() { char na[20]; int c; int x,m,j,i; printf("请输入要打开的文件名 \\n"); getchar(); gets(na) ; printf("你想对文件进行写还是读操作?\\n"); scanf("%d",&c); getchar(); for(i=0;i if(strcmp(UFD[U][i].filename,na)==0) { m=i; for(j=0;j<5;j++) { if(strcmp(UOF[U][j].filename,na)==0) { if(UOF[U][j].flag1==1) { printf("文件正在被创建,不能打开!\\n"); break; } else { printf("文件已经打开\\n"); break; } } } if(j==5) /*UOF中没有该文件,即:该文件尚未打开*/ { if(UFD[U][m].access==c) { for(x=0;x<5;x++) if(UOF[U][x].flag==0) { strcpy(UOF[U][x].filename,UFD[U][m].filename); UOF[U][x].length=UFD[U][m].length; UOF[U][x].access=UFD[U][m].access; UOF[U][x].flag1=2; UOF[U][x].flag=1; UOF[U][x].read=UFD[U][m].address[0]; UOF[U][x].write=UFD[U][m].address[0]; printf("文件打开成功\\n"); break; } } else printf("操作不合法,不能打开!\\n"); break; } } if(i==L) printf("文件不存在,不能打开!\\n"); } } /*OPEN()已调试完!*/ /*写文件函数*/ void write() { char nam[20]; int i,j,n,b,e,k; int m=-1; static int ad[5]; printf("请输入要进行写操作的文件名 \\n"); getchar();gets(nam); for(i=0;i<5;i++) { if(strcmp(UOF[U][i].filename,nam)==0) { if(UOF[U][i].flag1==1)/*文件为建立状态*/ { m=i; for(e=1;e { printf("输入地址%d\\n",e); scanf("%d",&ad[e]); for(k=0;k<20;k++) if(ad[e]==memo[k]) { printf("the address%d is wrong and input another one\\n",e); scanf("%d",&ad[e]); break; } for(j=0;j<128;j++) { if(memo[j]==0) { memo[j]=ad[e]; break; } } UOF[U][m].address[e]=ad[e]; UOF[m]->write=ad[e]; } printf("写文件成功!\\n"); break; } else /*不是建立状态*/ if(UOF[U][i].access==1) {printf("操作不合法,不能写!\\n");break;} else { printf("是顺序修改吗?1为顺序,0为非顺序 1/0?\\n"); scanf("%d",&n); if(n==1) { for(e=0;e UOF[U][m].write=UOF[U][m].address[e] ; printf("本记录%d修改完成!,UOF[m].address[e]\\n"); } printf("写文件成功!\\n"); break; } else {printf("想修改哪条记录?\\n"); scanf("%d",&b); printf("the %d record is %d",b,UOF[U][m].address[b]); UOF[U][m].write=UOF[U][m].address[b] ; printf("本记录%d修改完成!,UOF[m].address[e]\\n"); printf("写文件成功!\\n"); break; } } } } if(i==5) printf("文件尚未建立或打开,不能写! \\n"); } void read() {char nam[20]; int i,le,m=-1; static int ad[5]; int ipaddress; printf("请输入要进行读操作的文件名 \\n"); getchar();gets(nam); printf("请输入读长度\\n"); scanf("%d",&le); for(i=0;i<5;i++)/*检查文件是否已经打开*/ if(strcmp(UOF[U][i].filename,nam)==0) m=i; if(i==5) printf("文件尚未打开,不能读!\\n"); else {ipaddress=UOF[U][m].read; for(i=0;i UOF[U][m].read=ipaddress; printf("读文件成功!\\n"); } } delet() { char noname[20]="00"; struct FCB *P=MFD[U].userfaddr; int I; int j,i; char s[20]; printf("请输入文件名\\n"); scanf("%s",s); for(j=0;j { printf("有该文件!\\n"); I=j; for(i=0;i<20;i++)/*检查文件是否已经打开*/ if(strcmp(UOF[i]->filename,s)==0) {strcpy(noname,UOF[i]->filename); UOF[i]->access=0; UOF[i]->length =0; UOF[i]->write =0; UOF[i]->flag=0; } strcpy(noname,UFD[I]->filename); UFD[I]->access=0; UFD[I]->length=0; UFD[I]->address[0]=0; UFD[I]->flag=0; } printf("文件不存在,或文件已经撤销!\\n"); } /*显示函数*/ void print_UFD() { int i ; printf("num filename access length flag ad1 ad2 ad3 ad4 ad5 \\n "); for(i=0;i<5;i++) printf("\\n%d\%s\%3d\%3d\%3d\%3d\%3d\%3d\%3d\%3d\\n",i,UFD[U][i].filename,UFD[U][i].access,UFD[U][i].length,UFD[U][i].flag,UFD[U][i].address[0],UFD[U][i].address[1],UFD[U][i].address[2],UFD[U][i].address[3],UFD[U][i].address[4]); } void print_UOF() { int i; printf("num filename access length flag write read flag1 \\n "); for(i=0;i<5;i++) printf("\\n%1d\%s\%d\%d\%d\%d\%d\%dn",i,UOF[U][i].filename,UOF[U][i].access,UOF[U][i].length,UOF[U][i].flag,UOF[U][i].write,UOF[U][i].read,UOF[U][i].flag); } void main() { char name[20]; int i,a; printf("please welcome to file mangment .\\n"); printf("\\nplease input the user\\n") ; LL:scanf("%s",name); getchar(); for(i=0;i if(strcmp(MFD[i].username,name)==0) { U=i; while(1) { printf("\\n-----------weclome-------------\\n"); printf("1:建立文件操作.\\n"); printf("2:打开文件操作.\\n"); printf("3:关闭文件操作.\\n") ; printf("4:读文件操作.\\n"); printf("5:写文件操作。\\n"); printf("6:撤消文件操作\\n"); printf("0:结束.\\n"); printf("7: 命令错误!\\n"); printf("-------------------------------\\n"); printf("\\n请选择操作命令:\\n"); scanf("%d",&a); 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("error\\n"); default:break; } } } } printf("无此用户\\n"); printf("请再次输入用户名!\\n"); goto LL; }