实验四 系统实验报告.doc_第1页
实验四 系统实验报告.doc_第2页
实验四 系统实验报告.doc_第3页
实验四 系统实验报告.doc_第4页
实验四 系统实验报告.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验四 文件系统实验一 . 目的要求 1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。 2、要求设计一个 n个用户的文件系统,每次用户可保存m个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。二 . 例题: 1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。2、程序采用二级文件目录(即设置主目录MFD)和用户文件目录(UED)。另外,为打开文件设置了运行文件目录(AFD)。3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。4、算法与框图: 因系统小,文件目录的检索使用了简单的线性搜索。 文件保护简单使用了三位保护码:允许读写执行、对应位为 1,对应位为0,则表示不允许读写、执行。 程序中使用的主要设计结构如下: 主文件目录和用户文件目录( MFD、UFD) 打开文件目录( AFD)(即运行文件目录)M D FU F DA F D用户名文件名打开文件名文件目录指针保护码打开保护码用户名文件长度读写指针文件目录指针文件名文件系统算法的流程图如下:三 . 实验题: 1、增加 23个文件操作命令,并加以实现。(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。#include #include #include #include #define MAXSIZE 100 #define ADDSIZE 50 #define PT elem+l- length #define N 4 typedef struct term/*班级和学期的结构体*/ char class110; char term110; term; typedef struct student/*学生成绩信息的结构体*/ term st;/*班级和学期结构体放于此结构体中*/ char num10; char name12; float course4; float total; float average; int bit; lnode,*stu; typedef struct lnode *elem;/*指向上个结构体的指针*/ int size;/*最大能放lnode结构体成员的个数*/ int length;/*当前长度*/ sqack,*sq; sqack *l; void init(void)/*动态分配存储空间*/ l- elem=(stu)malloc(MAXSIZE*sizeof(lnode); l- length =0; l- size=MAXSIZE; void input(void)/*输入学生的信息*/ lnode *newbase,*p; char cla10,ter10,ch; int n,i; if(l- length =l- size) newbase=(stu)realloc(l- elem,(l- size +ADDSIZE)*sizeof(lnode);/*追加存储空间*/ l- elem =newbase; l- size +=ADDSIZE; p=l- elem; do printf( 输入班级和学期(学期用这种格式,如2005年上学期 2005 1,2005年下学期 2005 2;先输入班级,回车后再输入学期)n ); gets(cla); gets(ter); printf( 要输入多少个名单? ); scanf( %d ,&n); printf( 输入学生的成绩n学号t姓名t科目1t科目2t科目3t科目4n ); for(i=0;i num ,p- name,p- course0,p- course1,p- course2,p- course3); strcpy(p- st.class1,cla); strcpy(p- st.term1,ter); +l- length ; printf( 要继续吗?(y/n) ); ch=getchar();while(ch= Y |ch= y ); void change()/*修改学生的信息*/ lnode *p; lnode e; int flag=1,i; char s110,num110; printf( 输入学期和学号(输入学期以后按回车再输入学号):n ); gets(s1); gets(num1); p=l- elem ; while(p elem+l- length ) & flag=1)/*查找要修改的学生的信息*/ if(strcmp(p- num,num1)=0&strcmp(p- st.term1,s1)=0) flag=0;/*找到了*/ p+; p-; if(flag=1) printf( 找不到此学号!n ); printf( %s %s ,p- num,p- name); for(i=0;i coursei); printf( n ); printf( 输入修改信息n ); scanf( %s%s%s%s ,e.st.class1,e.st.term1,&e.num,); for(i=0;i elem ; while(p elem+l- length ) if(strcmp(p- st.term1,t1)=0&strcmp(p- st.class1 ,t2)=0) *q=*p;q+; i+; p+; *k=i; void sort(lnode *p,int *k)/*按学生成绩从高到低排序函数*/ int i; lnode *q,temp; for(q=p;q total =0; for(i=0;i total =q- total +q- course i; q- average =q- total /N; for(i=0;i *k-1;i+) for(q=p;q total total) temp=*q;*q=*(q+1);*(q+1)=temp; void print(lnode *q,int *k)/*输出学生的成绩*/ lnode *p; p=q; for(p=q;p num,p- name); for(int i=0;i coursei); printf( %d %f ,p- total,p- average); printf( n ); void stat()/*统计学生的成绩*/ lnode tt50; char ter10,clas10; int i,k; printf( 请输入学期和班级(输入学期后按回车再输入班级):n ); for(i=0;teri!= n ;i+) teri=getchar(); for(i=0;clasi!= n ;i+) clasi=getchar(); same(ter,clas,tt,&k);/*把学期和班级相同的学生信息放在结构体数组tt中*/ sort(tt,&k);/*按学生成绩从高到低排序函数*/ print(tt,&k);/*输出学生的成绩*/ void search1()/*按学号查*/ lnode *p; char ter110; int i,flag=1; p=l- elem; printf( 输入学号: ); gets(ter1); for(p=l- elem;p PT;p+) if(strcmp(p- num,ter1)=0) flag=0; printf( %s %s ,p- st.term1,p- st.class1); printf( %s %s ,p- num,p- name); for(i=0;i coursei); printf( %d %3.1f ,p- total,p- average); printf( n ); if(flag) printf( 没有找到! ); void search2()/*按姓名查*/ lnode *p; char ter110; int i,flag=1; p=l- elem; printf( 输入姓名: ); gets(ter1); for(p=l- elem;p PT;p+) if(strcmp(p- name,ter1)=0) flag=0; printf( %s %s ,p- st.term1,p- st.class1); printf( %s %s ,p- num,p- name); for(i=0;i coursei); printf( %d %f ,p- total,p- average); printf( n ); if(flag) printf( 没有找到! ) ; void search()/*查找学生的成绩*/ char ch; do printf( 1 按学号查询n2按姓名查询n ); ch=getchar(); switch(ch) case 1 : search1(); break; case 2 : search2(); break; default: printf( 错误!n ); printf( 要继续查找吗?(y/n) ); ch=getchar(); while(ch= y | ch= Y ); void fail()/*查找不及格及学生名单*/ int i; lnode *p; for(p=l- elem;p PT;p+) for(i=0;i coursei st.class1,p- st.term1); for(i=0;i coursei); printf( %d %f ,p- total,p- average); printf( n ); void output()/*按班级输出学生的成绩单*/ lnode tt50; int k; char clas10,ter110; printf( 输入要查询的班级和学期(输入班级后按回车输入学期):n ); gets(clas); gets(ter1); same(ter1,clas,tt,&k);/*把学期和班级相同的学生信息放在结构体数组tt中*/ print(tt,&k);/*输出学生的成绩*/ int main() char ch; do printf( 请选择:n ); printf( 1 对学生成绩的录入n2 对学生成绩的修改n3 统计学生成绩n4 查询学生成绩n5查找不及格科目及学生名单n6 按班级输出学生成绩单n ); ch=getchar(); switch(ch) case 1 : input();break; case 2 :change();break; case 3 :stat();break; case 4 :search();break; case 5 :fail();break; case 6 :output();break; default:printf( 错误!n ); printf( 要继续吗?(y/n) ); ch=getchar(); while(ch= y |ch= Y ); return 0; getch(); 2、编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。#include #include #include /主文件结构体 struct MasterFile char username20; /用户名 char password20; /用户名密码 char flag; /标志 struct MasterFile *next; ; /用户文件结构体 struct UserFile int fnum; /文件编号 char fname20; /文件名 int flength; /文件长度 char flag; /标志 char fpw20; /文件保护码 struct UserFile *link; ; /全局变量 int shoudsave; /存储标记 int usingnum; /当前用户标记 struct MasterFile MFD20; /主目录 struct UserFile UFD2020; /用户目录 /寻找主目录空闲区 struct MasterFile*MoveMFDToLast() for(int i=0;i20;i+) if(MFDi.flag=0) usingnum=i; return &MFDi; return NULL; /查找用户 struct MasterFile*SearchMFD(char str) for(int i=0;i20;i+) if(strcmp(str,MFDi.username)=0) usingnum=i; return &MFDi; return NULL; /寻找用户目录空闲区 struct UserFile *MoveUFDToLast() for(int i=0;i20;i+) if(UFDusingnumi.flag=0) return &UFDusingnumi; return NULL; /查找用户文件 struct UserFile *SearchUFD(int num) for(int i=0;i20;i+) if(UFDusingnumi.fnum=num) return &UFDusingnumi; return NULL; /删除用户文件目录 void LeftMoveUFD(int num) for(int i=0;i20;i+) if(UFDusingnumi.fnum=num) for(int j=i;jusername,str1); strcpy(p-password,str2); p-flag=1; printf(%d,MFDusingnum.flag); p-next=NULL; shoudsave=1; /存储标记 else /旧用户登录 while(1) printf(请输入你的用户名:); /输入用户名 scanf(%s,&str3); p=SearchMFD(str3); if(p=NULL) printf(对不起,你输入的用户名不存在!n); printf(继续(y)还是放弃(n)?); scanf(%s,&flag3); if(flag3=y) continue; else printf(你已退出了系统!n); exit(1); else while(1) printf(请输入口令:); /输入口令 scanf(%s,&str4); if(strcmp(str4,p-password)!=0) printf(对不起,你输入的口令不正确,请重新输入.n); continue; else break; break; /菜单 void menu() printf(n*); printf(t1列文件目录ttttt2创建文件n); printf(t3删除文件ttttt4读文件n); printf(t5写文件tttttt0退出系统n); printf(*n); /列文件目录 void Dir() if(MFDusingnum.next=0) printf(目前你不存在任何文件!n); else for(int i=0;ilink=(struct UserFile*)fp; /设置用户目录 MFDusingnum.next=(struct MasterFile*)&UFDusingnum0; strcpy(f-fname,str1); strcpy(f-fpw,str2); f-fnum=num; f-flength=0; f-flag=1; fclose(fp); shoudsave=1; /设置存储标记 printf(文件已创建!n); /删除文件 void Delete() struct UserFile *f; int num; printf(请输入你要删除的文件编号:); scanf(%d,&num); f=SearchUFD(num); /查找用户文件 if(f=NULL) printf(你要删除的文件不存在!n); else LeftMoveUFD(num); /删除用户文件目录 printf(文件已删除!n); shoudsave=1; /设置存储标记 /读文件 void Read() char ch; struct UserFile *f; FILE *fp; int num; printf(请输入你要读的文件的编号:); scanf(%d,&num); f=SearchUFD(num); /查找文件 if(f=NULL) printf(你输入的文件不存在!n); else if(fp=fopen(f-fname,r)=NULL) /打开指定文件 printf(不能打开该文件!n); exit(0); ch=fgetc(fp); /输出文件内容 while(ch!=EOF) putchar(ch); ch=fgetc(fp); printf(n); fclose(fp); /关闭文件 printf(文件已读完毕!n); /写文件 void Write() char ch; struct UserFile *f; FILE *fp; int num; printf(请输入你要写的文件的编号:); scanf(%d,&num); f=SearchUFD(num); /查找文件 if(f=NULL) printf(你输入的文件不存在!n); else if(fp=fopen(f-fname,wr)=NULL) /打开指定文件 printf(不能打开该文件!n); exit(0); printf(请按字符输入内容(以#表示结束符); /写入文件 scanf(%s,&ch); while(ch!=#) fwrite(&ch,1,1,fp); scanf(%s,&ch); fclose(fp); /关闭文件 shoudsave=1; /设置存储标记 printf(文件写入完毕!n); /保存 void Save() FILE *fpm,*fpu; int flag=1,count=0; fpm=fopen(F:MasterFile.txt,wb); /打开主文件 if(fpm=NULL) printf(n提示:重新打开主文件信息文件时发生错误!n); exit(1); for(int i=0;i20;i+) fwrite(&MFDi,sizeof(struct MasterFile),1,fpm); /保存主文件目录信息 fclose(fpm); printf(主文件目录信息保存完毕!n); fpu=fopen(F:UserFile.txt,wb); /打开用户文件 if(fpu=NULL) printf(n提示:重新打开用户目录信息文件时发生错误!n); exit(1); for(int j=0;j20;j+) /保存用户文件目录信息 fwrite(&UFDj,sizeof(struct UserFile),20,fpu); fclose(fpu); printf(用户文件目录信息保存完毕!n); /主函数 void main() FILE *fpm,*fpu; /文件指针 int sel; char ch; char jian; printf(tttt文件管理系统nttttn); fpm=fopen(D:MasterFile.txt,rb); /打开主文件目录信息文件 if(fpm=NULL) printf(n提示:主文件目录信息文件还不存在,是否创建?(y/n)n); scanf(%s,&jian); if(jian=y|jian=Y) fpm=fopen(D:MasterFile.txt,wb); /创建主文件目录的文件 else exit(0); fpu=fopen(D:UserFile.txt,rb); /打开用户文件目录信息文件 if(fpu=NULL) printf(n提示:用户文件目录信息文件还不存在,是否创建?(y/n)n); scanf(%s,&jian); if(jian=y|jian=Y) fpu=fopen(D:UserFile.txt,wb); /创建用户文件目录的文件 else exit(0); printf(文件正在打开,请稍等.); for(int i=0;i20;i+) /读取主文件目录信息 fread(&MFDi,sizeof(struct MasterFile),1,fpm); /将文件的内容放入接点中 fclose(fpm); / 关闭文件 while(!feof(fpu) /读取用户目录文件信息 for(int i=0;i20;i+) if(fread(&UFDi0,sizeof(struct UserFile),20,fpu) /将文件的内容放入接点中 MFDi.next=(struct MasterFile*)&UFDi0; fclose(fpu); /关闭文件 printf(n文件已导入完毕!n); Login(); /用户登录while(1) /菜单操作 menu(); printf(请你选择操作:); scanf(%d,&sel); if(sel=0) /保存文件信息 if(shoudsave=1) getchar(); printf(n资料已经改动,是否将改动保存到文件中(y/n)?n); scanf(%c,&ch); if(ch=y|ch=Y) Save(); printf(n你已经退出系统,再见!n); break; switch(sel) case 1:Dir(); break; /列文件目录 case 2:Create();break; /创建文件 case 3:Delete();break; /删除文件 case 4:Read(); break; /读文件 case 5:Write(); break; /写文件 default: printf(你输的选项有误,请重新输入!n);break; 3、设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。#include #include #include #include #include #define FILENAME_LEN 21#define INPUT_LEN 81#define COMMAND_LEN 11/结点结构struct FileNode char filenameFILENAME_LEN;/文件名/目录名 int isdir;/目录文件识别标志 int i_nlink;/文件的链接数 int adr;/文件的地址 struct FileNode *parent, *child;/指向父亲的指针和指向左孩子的指针 struct FileNode *sibling_prev, *sibling_next;/指向前一个兄弟的指针和指向/后一个兄弟的指针.;void Init();/初始化文件树int ParseCommand();/接受输入的命令并把其分解成操作名和路径文件名void ExecuteCommand();/执行命令int cdComd();/处理cd命令int editComd();/处理edit命令创建文件int delComd();/处理del命令删除文件int rdComd();/处理rd命令/删除目录int dirComd();/处理dir命令int mdComd();/处理md命令创建目录int FindPath(char *ph);/寻找参数ph所指向的路径/从参数Para2中找到要建立或删除的文件、目录名,并把指针指向其父亲结点int FindFilename(char Para2);struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink);/创建结点int GetInput(char* buffer,unsigned int buffer_len);/获取输入int CheckCommand();/命令检查int GetDir(int begin,char* path,char* curDir);/获取路径void Trim(char* str);struct FileNode * cp, *tp, *root,*upper;char pathINPUT_LEN-COMMAND_LEN;/记录当前走过的路径char curpathINPUT_LEN-COMMAND_LEN,Para1COMMAND_LEN, Para2INPUT_LEN-COMMAND_LEN,tmppathINPUT_LEN-COMMAND_LEN;char filenameFILENAME_LEN,dirnameFILENAME_LEN,tmp;int i,j;/主函数int main() printf(n); Init();/初始化文件树 while(1) if(ParseCommand()/分解命令 ExecuteCommand();/执行命令 /执行命令子函数void ExecuteCommand() int sign; /根据参数Para1调用相应的功能处理模块 if(strcmp(Para1,cd)=0) sign=cdComd(); /cd命令 else if(strcmp(Para1,edit)=0) sign=editComd(); /edit命令 else if(strcmp(Para1,del)=0) sign=delComd(); /del命令 else if(strcmp(Para1,dir)=0) sign=dirComd(); /dir命令 else if(strcmp(Para1,md)=0) sign=mdComd(); /md命令 else if(strcmp(Para1,rd)=0) sign=rdComd(); /rd命令 else if(strcmp(Para1,exit)=0) exit(0); /exit命令 else printf(命令错误,请重试n); /命令输入不正确,报错/创建结点struct FileNode* CreateFileNode(char filename,int isdir,int i_nlink) /申请结点空间 struct FileNode* node=(struct FileNode*)malloc(sizeof(struct FileNode); /相应内容赋初值 strcpy(node-filename,filename); node-isdir=isdir; node-i_nlink=i_nlink; node-parent=NULL; node-child=NULL; node-sibling_prev=NULL; node-sibling_next=NULL; return node;/初始化文件树void Init() struct FileNode *binNode,*usrNode, *unixNode,*etcNode,*libNode,*userNode, *binNode2,*liuNode,*sunNode,*ftiNode; strcpy(path,/); /根目录写入当前路径 /创建文件树的结点 binNode=CreateFileNode(bin,1,0); usrNode=CreateFileNode(usr,1,0); unixNode=CreateFileNode(unix,0,0); etcNode=CreateFileNode(etc,1,0); libNode=CreateFileNode(lib,1,0); userNode=CreateFileNode(user,1,0); binNode2=CreateFileNode(bin,1,0); liuNode=CreateFileNode(liu,1,0); sunNode=CreateFileNode(sun,1,0); ftiNode=CreateFileNode(fti,1,0); cp=tp=root=CreateFileNode(/,1,0); /结点相应内容赋值 root-parent=NULL; root-child=binNode; root-sibling_prev=root-sibling_next=NULL; binNode-parent=root; binNode-child=NULL; binNode-sibling_prev=NULL; binNode-sibling_next=usrNode; usrNode-parent=NULL; usrNode-child=libNode; usrNode-sibling_prev=binNode; usrNode-sibling_next=unixNode; unixNode-parent=NULL; unixNode-child=NULL; unixNode-sibling_prev=usrNode; unixNode-sibling_next=etcNode; etcNode-parent=NULL; etcNode-child=NULL; etcNode-sibling_prev=unixNode; etcNode-sibling_next=NULL; libNode-parent=usrNode; libNode-child=liuNode; libNode-sibling_prev=NULL; libNode-sibling_next=userNode; userNode-parent=NULL; userNode-chi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论