(4).关闭文件:close(文件名)
对某个文件不需要再读或写时,用户应关闭文件。若关闭一个新建立的文件,则要建立文件的结束标志。对链接文件来说,最后一块中的链接字应为“0”。关闭文件的工作流程如下:
“关闭文件”模拟流程
开 始 查用户 UOF 文件为“建立” 状态? 否 是 置文件结束标志 文件为“打开”状态? 消除该文件在UOF中的登记栏 否
显示:文件已关闭 显示:“关闭文件”成功 返 回
(5).删除文件:delete(文件名)
把请求撤消的文件从用户文件目录表中除名,收回该文件占用的存储区域。处理流程如下:
“删除文件”模拟流程
开 始 查该用目录表 UFD UFD中有该文件? 是 查该用户的UOF 显示:文件已撤消 返 回 UOF中有该文件? 是 否 在 UOF中清除该文件的登记栏 归 还文件所占的存储区域 在 UFD中清除该文件登记栏
(6).写文件:write(文件名,记录号)
否 执行写文件操作时要区分两种情况,第一种是在执行create后要求写。第二种是在执行open后要求写的。对第二种情况可认为用户要对一个已建立好的文件进行修改。一个文件可以分多次写,既可按记录顺序写也可随机写一个记录,采用顺序写时可省略记录号。模拟写文件操作的工作的流程图如下:
“写文件”模拟流程
开 始 该文件为“建立”状态? 返 回 是 把记录信息写到“写指针”指出的物理块中(用显示物理块号来模拟) 文件属性为“只读”? 是 查用户的UOF UOF中有该文件 否 显示:文件尚未建立或打开,不能写
是 显示:操作不合法,不能写 否 顺序修改? 是 取出“写指针”指出的块号 找出存放指定记录的块返 回 修改“写指针” 把修改后的信息写入找到的物理块中 显示:“写文件”成功 返 回 注:流程图中“寻找空闲块”的工作可以用取一个随机数来模拟,取到的随机灵敏即为空闲块号
五:源程序及注释如下:
#define S 10 #define L 20 #define N 30 #include\#include\#include\struct UFD{
char fname[20]; char shuxing[20]; int length; int addr; };
struct UOF{
char fname[20]; char shuxing[10]; int length; char state[10]; int *w,*r; }; struct MFD{
char uname[25]; struct UFD ufd[L]; struct UOF uof[S]; };
struct MFD mfd[N];
create(int x); open(int x); close(int x); Read(int x); write(int x); delete(int x);
main() {
char namestr[20],order[20]; int i,j;
/*chu shi hua MFD*/
/************************************************************/ strcpy(mfd[0].uname,\
strcpy(mfd[0].ufd[0].fname,\ strcpy(mfd[0].ufd[0].shuxing,\ mfd[0].ufd[0].length=25; mfd[0].ufd[0].addr=6120; /*
printf(\ame,mfd[0].ufd[0].shuxing,mfd[0].ufd[0].length,mfd[0].ufd[0].addr);*/ strcpy(mfd[0].ufd[1].fname,\ strcpy(mfd[0].ufd[1].shuxing,\ mfd[0].ufd[1].length=20; mfd[0].ufd[1].addr=0;
strcpy(mfd[0].ufd[2].fname,\strcpy(mfd[0].ufd[2].shuxing,\ mfd[0].ufd[2].length=20; mfd[0].ufd[2].addr=1000;
strcpy(mfd[1].uname,\
strcpy(mfd[1].ufd[0].fname,\ strcpy(mfd[1].ufd[0].shuxing,\ mfd[1].ufd[0].length=30; mfd[1].ufd[0].addr=4020;
strcpy(mfd[1].ufd[1].fname,\ strcpy(mfd[1].ufd[1].shuxing,\ mfd[1].ufd[1].length=21; mfd[1].ufd[1].addr=1;
/*chu shi hua UOF*/
strcpy(mfd[0].uof[0].fname,\
strcpy(mfd[0].uof[0].shuxing,mfd[0].ufd[0].shuxing); mfd[0].uof[0].length=mfd[0].ufd[0].length; strcpy(mfd[0].uof[0].state,\ mfd[0].uof[0].w=mfd[0].ufd[0].addr; mfd[0].uof[0].r=mfd[0].ufd[0].addr;
strcpy(mfd[0].uof[1].fname,\
strcpy(mfd[0].uof[1].shuxing,mfd[0].ufd[2].shuxing); mfd[0].uof[1].length=mfd[0].ufd[2].length; strcpy(mfd[0].uof[1].state,\ mfd[0].uof[1].w=mfd[0].ufd[2].addr; mfd[0].uof[1].r=mfd[0].ufd[2].addr; /* printf(\
/*******************************************************/