2022年文件系统实验报告 .pdf
篇一:实验四文件系统实验报告实验四文件系统实验一 . 目的要求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 ) (即运行文件目录)文件系统算法的流程图如下:三 . 实验题:1、增加 2 3 个文件操作命令,并加以实现。(如移动读写指针,改变文件属性,更换文件名,改变文件保护级别)。#include <stdio.h> #include <malloc.h> #include <string.h> #include <conio.h> #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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 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 <n;i+) scanf( %s%s%d%d%d%d ,p-> 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 ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - void change()/*修改学生的信息*/ lnode *p; lnode e; int flag=1,i; char s110,num110; printf( 输入学期和学号( 输入学期以后按回车再输入学号):n ); gets(s1); gets(num1); p=l-> elem ; while(p <=(l-> 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 <n;i+) printf( %d ,p-> coursei); printf( n ); printf( 输入修改信息n ); scanf( %s%s%s%s ,e.st.class1,e.st.term1,&e.num,e.name); for(i=0;i <n;i+) scanf( %d ,&e.coursei); *p=e; void same(char *t1,char *t2,lnode *t,int *k) /*把学期和班级相同的学生信息放在结构体数组tt中 */ int i=0; lnode *p,*q; q=t; p=l-> elem ; while(p <=l-> elem+l-> length ) if(strcmp(p-> st.term1,t1)=0&&strcmp(p-> st.class1 ,t2)=0) *q=*p;q+; i+; p+; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - *k=i; void sort(lnode *p,int *k)/*按学生成绩从高到低排序函数*/ int i; lnode *q,temp; for(q=p;q <p+ *k;q+) q-> total =0; for(i=0;i <n;i+) q-> total =q-> total +q-> course i; q-> average =q-> total /n; for(i=0;i <*k-1;i+) for(q=p;q <p+*k-1-i;q+) if(q-> total <(q+1)-> total) temp=*q;*q=*(q+1);*(q+1)=temp; void print(lnode *q,int *k)/*输出学生的成绩*/ lnode *p; p=q; for(p=q;p <q+*k;p+) printf( %s %s ,p-> num,p-> name); for(int i=0;i <n;i+) printf( %d ,p-> 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中 */ 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - 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 <l-> 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 <n;i+) printf( %d ,p-> 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 <l-> 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 <n;i+) printf( %d ,p-> coursei); printf( %d %f ,p-> total,p-> average); printf( n ); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - 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 <l-> pt;p+) for(i=0;i <n;i+) if(p-> coursei <60) printf( %s %s ,p-> st.class1,p-> st.term1); for(i=0;i <n;i+) printf( %d ,p-> coursei); printf( %d %f ,p-> total,p-> average); printf( n ); void output()/*按班级输出学生的成绩单*/ lnode tt50; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - int k; char clas10,ter110; printf( 输入要查询的班级和学期(输入班级后按回车输入学期):n ); gets(clas); gets(ter1); same(ter1,clas,tt,&k);/*把学期和班级相同的学生信息放在结构体数组tt中 */ print(tt,&k);/*输出学生的成绩*/ 篇二:文件系统实验报告试验四文件系统一、实验目的1、 用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。2、 要求设计一个n 个用户的文件系统,每次用户可以保存m个文件。用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有 create 、delete 、open、close 、read 、write等命令。二、实验题目 : 采用二级目录结构实现磁盘文件操作。要求:1普通文件的目录项包括文件名,文件类型,文件长度,指向文件内容的指针内容。2目录文件的目录项包括目录名,指向下一级目录块的指针内容。假定每个目录文件最多只能占用一个块;3程序功能方面的要求:需要实现一个命令行操作界面,包含如下命令:4程序实现方面的要求:(1) 、对于重名(创建时) ,文件不存在(删除时),目录不存在(改变目录时)等错误操作情况,程序应该做出相应处理并给出错误信息,但是程序不得因此而退出。(2) 、界面友好,程序强壮。(3) 、设置界面的提示符,提示的命令以及调试的方法应和前面的要求一致。不要自己设计命令或者附加不要求的功能。三. 实验源程序文件名: filesystem_s.cpp 执行文件名 : project1.exe 四. 实验分析1) 总论:该系统是一个多用户、多任务的实时操作系统。对用户和用户的文件数目并没有上限。也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。该系统的操作命令如下:、 bye- 用户注销命令。当使用该命令时,用户退出系统。命令格式:runbye 系统注销该用户并回到登陆界面。、 close- 删除用户注册信息命令。执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。命令格式:runclose. 完成后返回登陆界面。、 create-在当前目录下创建一个文件,且该文件不能跟系统中的文件重名。该文件的管理信息登录到用户文件信息管理模块中。命令格式:runcreate>file1。 其中 file1为要创建的文件名称。执行完该命令后回到执行命令行。、 delete-删除当前用户目录下的一个文件。命令格式:rundelete>file1。返回命令行。、list-显示当前注册目录下的所有文件信息,包括文件名、文件长度、文件操作权限。命名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - 令格式: runlist。、 chmod-改变某个文件的执行权限,但前提是该文件是该用户目录下的文件。命令格式: runchmod>file1。、 open- 在 window 界面下打开某个文件。命令格:runopen>file1。执行该命令后,文件 file1将用在 windows 界面下的文件形式打开。用户可以在这个方式中对文件进行修改,并将修改后的内容保存。、 read- 读文件信息。 将文件信息读入并显示在终端。命令格式:runread>file1。 、write-向某个文件写入新的信息。用户可以选择用覆盖原来内容的方式和在文件的末尾插入新信息的方式写入信息。 2)_ 系统采用二级文件目录。设置主目录(mfd)和用户文件目录(ufd) ,分别以文件的方式保存在磁盘中。在主目录中又注册用户的用户名和另一标志该用户目录下是否有文件的指针标记。用户文件目录用用户名作为文件名保存在磁盘,以便检索时方便对应。在用户文件目录中保存着该目录下所有的文件的文件名称、保护码、文件长度。3) 该系统大量使用高级语言中的文件操作函数,所以能实际看到文件的创建写入、读出、删除等效果。 4) 实验流程图5) 源程序 : #include<iostream.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include conio.h #include<dos.h> #define null 0 #define keynum 10 #define getspace(type) (type*)malloc(sizeof(type) char cmd64; /存放用户输入命令char buffer36;/ char user32;/存放当前登陆的用户名 typedef char alfa12; alfa kwordkeynum; struct ufd/用户文件管理模块char filename32; /文件名int safecode; /文件保护码long length; /文件长度*curfile = null; struct mfd/用户登陆信息管理模块 char username32; /用户名 bool filepoint; /用户目录下的文件指针,false表示目录为空*curuser = null,*elseuser=null; typedef ufd ufd; typedef mfd mfd; void main(); void keyword()/初始化命令关键字名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - strcpy(kword 1,bye); strcpy(kword 2,chmod); strcpy(kword 3,close); strcpy(kword 4,create); strcpy(kword 5,delete); strcpy(kword 6,list); strcpy(kword 7,open);strcpy(kword 8,read); strcpy(kword 9,write); int logindisplay() /登陆选项操作函数 int selete_1 = 0; do cout<<*请 选 择 操 作 *n1、 用 户 登 陆2 、 用 户 注 册0 、 退 出<<endl;cin>>selete_1; while(selete_1<0 | selete_1>2); system(cls); return selete_1; bool login(int selete)/用户登陆,注册函数 file *fp,*fp1,*fp2; char name12; switch(selete) case 1:/用户登陆 if(fp = fopen(login.exe,rb) = null)/打开用户注册目录管理文件 cout<<n错误:不能打开登陆文件。 <<endl; getch();system(cls); return false; curuser = getspace(mfd); cout<<n*登 陆 *n用 户 名 : ; cin>>name; /输入用户登陆名 while(!feof(fp) /检查该用户是否合法 fread(curuser,sizeof(mfd),1,fp); if(strcmp(curuser->username,name)=0) break; if(feof(fp) /如果没有找到跟当前登陆用户名相同的管理信息,提示出错 cout<<n错误:该用户不存在。<<endl; fclose(fp); return false; else fclose(fp); return true; break; case 2: /新 用 户 注 册if(fp=fopen(login.exe,ab)=null)/如果登陆信息管理文件不存在fp=fopen(login.exe,wb+);/创 建 该 信 息 管 理 文 件char name12; curuser = getspace(mfd); while(1) cout<<n*新 用 户 注 册 *<<endl; cout<<用户名: ; cin>>name; / 输入用户注册名 fp1 = fopen(login.exe,rb); while(!feof(fp1)/查看该用户名是否被别的用户占用 fread(curuser,sizeof(mfd),1,fp1); if(strcmp(curuser->username,name) = 0)/该名称已经被使用 cout<<n该用户已经存在, 请重新输入! <<endl;篇三:文件系统实验报告实验二文件系统实验报告一实验简介本实验要求在假设的i/o 系统之上开发一个简单的文件系统,这样做既能让实验者对文件系统有整体了解,又避免了涉及过多细节。用户通过create, open, read 等命令与文件系统交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0 至 l-1 。i/o 系统利用内存中的数组模拟磁盘。我设计的文件系统拥有三个用户。二具体说明1. 文件系统的组织:磁盘的前k 个块是保留区,其中包含如下信息:位图和文件描述符。位图用来描述磁盘块的分配情况。位图中的每一位对应一个逻辑块。创建或者删除文件,以及文件的长度发生变化时,文件系统都需要进行位图操作。前 k 个块的剩余部分包含一组文件名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - 描述符。每个文件描述符包含如下信息: ? 文件长度,单位字节? 文件分配到的磁盘块号数组。该数组的长度是一个系统参数。在实验中我们可以把它设置为一个比较小的数,例如3。 2 目录:我们的文件系统中仅设置一个目录,该目录包含文件系统中的所有文件。除了不需要显示地创建和删除之外,目录在很多方面和普通文件相像。目录对应0 号文件描述符。初始状态下,目录中没有文件,所有,目录对应的描述符中记录的长度应为0,而且也没有分配磁盘块。每创建一个文件,目录文件的长度便增加一分。目录文件的内容由一系列的目录项组成,其中每个目录项由如下内容组成: ? 文件名? 文件描述符序号 3. 对文件的操作:文件系统需提供如下函数;create, destroy, open, read, write。? create(filename): 根据指定的文件名创建新文件。? destroy(filename): 删除指定文件。? open(filename): 打开文件。该函数返回的索引号可用于后续的read, write, lseek, 或close 操作。? close(index): 关闭制定文件。? read(index, mem_area, count): 从指定文件顺序读入count 个字节 mem_area 指定的内存位置。读操作从文件的读写指针指示的位置开始。? write(index, mem_area, count): 把 mem_area 指定的内存位置开始的count 个字节顺序写入指定文件。写操作从文件的读写指针指示的位置开始。? lseek(index, pos): 把文件的读写指针移动到pos 指定的位置。pos 是一个整数,表示从文件开始位置的偏移量。文件打开时,读写指针自动设置为0。每次读写操作之后,它指向最后被访问的字节的下一个位置。lseek 能够在不进行读写操作的情况下改变读写指针能位置。 ? directory: 列表显示所有文件及其长度。三实验过程创建文件create :此时显示文件中的文件:文件的删除delete:打开文件( open): 文件的写操作(write ): 读文件( read) : 关闭文件( close ): 退出系统( exit ): 四实验代码#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> #define null 0 typedef struct mdf/mdf结构体 char username20;/用户名 char filename20;/文件名 struct mdf *next; mdf; typedef struct ufd/ufd结构体 char filename20;/文件名 int protect;/文件保护码名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - unsigned int length;/文件长度 struct ufd *next; ufd; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -