实验八实验报告模拟_第1页
实验八实验报告模拟_第2页
实验八实验报告模拟_第3页
实验八实验报告模拟_第4页
实验八实验报告模拟_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、实验八模拟DOS文件的建立一、上机目的:磁盘文件是磁盘上存储的重要信息,通过本实验模拟DOS文件的建立和使用情况,理解磁盘文件的物理结构。文件管理是操作系统中重要的内容之一,不同的文件系统提供了不同的物理结构,通过实验,深入理解文件的物理结构与存取方法之间的关系,以便更好的掌握文件系统的概念。二、上机内容:(1)模拟设计DOS操作系统中磁盘文件的存储结构(2)模拟设计便于直接存取的索引文件结构三、开发环境Microsoft Visual C+环境,采用 C语言编程四、分析设计(一)实验原理(1)模拟设计DOS操作系统中磁盘文件的存储结构DOS操作系统对磁盘文件的管理采用链接结构,将所有的链接指

2、针集中在一起,存放在文件分配表(FAT)中。连接文件的第一个物理块号登记在文件目录中。其设计思想是:假定磁盘上共有N个物理块可供使用,当要存放文件时,从FAT表中寻找其值为0的项,用其对应的物理块存放文件信息,并把文件占有的各物理块用链接指针登记在FAT表中,再把文件的第一个物理块号登记在文件目录中。在DOS中FAT表的前两项用来记录磁盘的类型。而从第2项开始记录磁盘的分配情况和文件各物理块的链接情况。在FAT表中第三项的值如果为 0,表示对应的第三块空闲。假设磁盘空间共有 100个物理块,设计一个文件分配表 FAT100,其中每一个元素与一个物理块对应。开始时,先把FAT100初始化为0,前

3、两项是用来记录磁盘的类型,所以赋常值分别为-2,-1 。然后再写入文件,假设写入的文件为A文件长度为6,要把这个文件写入磁盘,就要为这个文件分配六个物理块,所以在FAT100表中,找到六个空闲的物理块分配给文件A系统就能够在磁盘上正确的保存文件Ao当你要给文件 A在指定的位置添加记录时,系统就要先找到一个空闲的物理块,然后把指定位置的物理块的值赋值给找到的空闲块,然后再把插入的记录插在原先指定的物理块上。这样做是为了不把在指定位置的值给覆盖掉,又能正确的插入。(2)模拟设计便于直接存取的索引文件结构在MS-DOS中通过文件目录,再沿着链查找FAT表,便可直接找到指定逻辑记录对应的物理块。在小型

4、机或更高级的文件系统中,直接存取文件的方法是为每个文件建立一个索引表,指出各逻辑记录与物理块的对应关系。在你要索引文件时,search()函数就能够通过比较你输入的文件名是否和你之前建立 的文件名相同,如果相同,就会索引出该文件,并且显示该文件的文件名、起始块号、文件 长度的详细信息;如果不相同,就会输出“找不到该文件”,在索引索引点时,就要用 search2()函数就通过输入的索引点是否为文件存储的最后 一个块而且输入的索引点的下一个物理块为0,就可以把文件索引出来。五、参考代码:#include /使用字符串函数时需要的头文件#include#includeconst int FDF=-2

5、;const int FFF=-1;const int N=100;int filenumber;struct FILEINFO/声明一个结构体类型(char name10;/文件名为字符串int start;/起始块号为整形int length;/文件长度为整形);FILEINFO file10;/定义结构体数组,file是结构体数组名,10为数组长度int FATN,freespace; /FAT 表和剩余空间/显示文件目录void printfmenu()/定义无参数返回值的printfmenu函数(int i;/定义变量i为整形printf(t 文件个数:%d n,filenumber

6、);/ 输出文件个数printf(t文件名起始块号文件长度n);/输出文件名,起始块号和文件长度for(i=0;ifilenumber;i+)(printf( %s %d %dn,,filei.start,filei.length);)/显示FAT表void printFAT()/定义无参数返回值的printFAT函数(int i;printf(t 空闲块数:%dn,freespace);printf(t-2 代表 FDF,-1 代表 FFFn);for(i=0;iN;i+)printf( No.%d %dn,i,FATi);) /搜索文件void search(char

7、*tmpname)int i;for(i=0;ifilenumber;i+)if(strcmp(,tmpname)=0)/比较插入文件名与已存在文件名是否相同printf(t 找到了 !n);printf(-t文件名起始块号文件长度n);printf( %s %d %dn,,filei.start,filei.length);)elseprintf(t不存在该文件!);)/搜索索引点void search2(int searchpoint)int i=0;int m;if(FATsearchpoint=0)printf(-t该点空缺,没有文件!);els

8、e if(FATsearchpoint=-1&FATsearchpoint-1=-2|FATsearchpoint=-2&FATsearchpoint+ 1=-1)(printf(t此处为系统空间!);)else if(FATsearchpoint=-1&FATsearchpoint+1=0)(printf(t 找到了 !此处的文件名为:%s,);)else if(FATsearchpoint!=0&FATsearchpoint+1!=-1)(for(m=searchpoint;m+)(if(FATm=-1)printf(t 找到了 !此处的文件名为:%s,filei.na

9、me);else(printf(找不到该文件!);)break;)else if(FATsearchpoint!=0&FATsearchpoint+1=-1)(printf(找到了 !此处的文件名为:%s,);)/写入文件void write(char *tmpname,int tmplength)(int last,i,j;strcpy(,tmpname);/ 复制文件名和文件块个数filefilenumber.length=tmplength;for(i=2;iN;i+)(if(FATi=0)(filefilenumber.star

10、t=i;/首个空闲块为文件开始块last=i;FATlast=FFF;break;for(i=1;itmplength;i+)(for(j=2;jN;j+)if(FATj=0)(FATlast=j;last=j;FATlast=FFF;break;)FATlast=FFF;/文件末存结束标记freespace-=tmplength;/ 改变空闲块个数 filenumber+;printf(文件名和长度:s %dn,tmpname,tmplength);)/插入记录void insert(char *tmpname,int insertpoint)(int i;int last,brpoint;

11、for(i=0;i=filelast.length)(printf(插入点溢出!);return;)brpoint=filelast.start; /brpoint记录当前文件扫描到的位置for(i=0;iinsertpoint;i+)(brpoint=FATbrpoint;)for(i=0;iN;i+)(if(FATi=0)(FATi=FATbrpoint;FATbrpoint=i; break;)filelast.length+;/改变空闲块个数与文件长度freespace-;printf(t 文件名和长度:%s %dn,tmpname,filelast.length); ) void m

12、ain()(int i;char tmpname10;/要写入文件名的字符长度 int tmplength;/要写入文件长度int m;/ 命令filenumber=0;/初始文件个数为 0 for(i=0;iN;i+)/ 初始化 FAT 表 (FATi=0;)FAT0=FDF;FAT1=FFF;freespace=98;while(true)(printf(n);printf(* 欢迎进 入 *n);printf(n);printf(n”);printf(0.退出n);printf(1.写入文件2.插入文件3.显示文件目录n);printf(4.显示FAT表5.搜索文件6.搜索索引点n)pr

13、intf(*printf(n);printf(t选择服务菜单:);scanf(%d”,&m);switch(m)(case 0: exit(0);case 1: printf(t输入要写入的文件名:);scanf(%s”,&tmpname);printf(t输入要写入的文件长度:);scanf(%d,&tmplength);write(tmpname,tmplength);/ 调用 write 函数 break;case 2: printf(t输入要插入的文件名:);scanf(%s,&tmpname);int insertpoint;printf(t输入要插入的点:);scanf(%d,&insertpoint);insert(tmpname,insertpoint);/ 调用插入函数 break;case 3: printfmenu();/ 调用 printfmenu 函数显示文件目录 break;case 4: printFAT();/ 调用 printFAT 函数显示 FAT 表 break;case 5: pr

温馨提示

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

评论

0/150

提交评论