实验七 文件结构_第1页
实验七 文件结构_第2页
实验七 文件结构_第3页
实验七 文件结构_第4页
实验七 文件结构_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

1、实习七 文件结构1、 实习内容把文件的逻辑结构转换成存储结构,设计便于顺序存取和直接存取的文件存储结构。2、 实习目的文件的结构是指文件中信息的构造方式,通常分成逻辑结构和存储结构两种。文件的逻辑结构是从用户的观点出发,研究用户概念中的信息组织方式,这时,把文件看成是若干个逻辑记录的集合。文件的存储结构是指文件中的信息在物理存储介质上的存放方法和组织关系,这时,把文件看成是相关物理块的有序集合。用户是按逻辑结构来生成和使用文件的,而文件系统必须按照存储设备的物理特性和用户对文件信息的存取方式来管理文件。所以,文件系统一个主要任务就是要在文件的逻辑结构和存储结构之间建立一个映射。本实习要求学生模

2、拟设计文件的存储结构,通过实习理解文件的逻辑结构、存储结构、存取方式之间的联系。3、 实习题目第一题:模拟设计MS-DOS操作系统中磁盘文件的存储结构。提示:(1) 当用户对记录式文件采用顺序存以方式时,用户总是依次地访问一个个逻辑记录,即当访问了第I个记录后,下次总是访问第i+1个记录。所以,当用户采用顺序存取方式访问文件时,只要给出访问要求(读或写)而无需再指出要访问的记录号。为了适应顺序存取,文件的存储结构可采用顺序文件或链接文件。由于顺序文件必须占用连续的存储空间,为了提高存储空间的利用率,在用户按逻辑记录顺序访问文件的情况下,一般采用链接文件的结构。链接文件可以存放在不连续的物理块中

3、,使用链接字(又称指针)来指出文件中各个物理块之间的关联。在一般情况下,链接文件的第一个物理块号登记在文件目录中,每一块中设置一个链接字,指出链接文件的下一个物理块号,最后一块中的链接字内容为“0”,表示文件结束。链接文件结构如图7-1。  图7-1 链接文件结构 (2) 采用上述的链接文件结构,只有读出一个物理块信息后才能从链接字中得知下一个物理块号。所以,当用户要在文件中插入一些信息时,文件系统必须多次地请求启动磁盘读出信息才能做插入工作。MS-DOS操作系统对链接文件结构作了改进,它是把所有的链接指针集中在一起,存放在文件定位表FAT中。查找链接字时不必读出

4、物理块信息可直接从FAT中得到。其设计思想是:假定磁盘上共有N个物理块可供使用,FAT就有N项,初始化时为全“0”,表示对应的物理块均可使用,当要存放文件时,从FAT中寻找为“0”的项,其对应的物理块用来存放文件信息,把文件的链接指针(指出物理块号)登记在FAT中,文件的第一块块号登记在文件目录中。例如: 图7-2 文件定位表FAT 在MS-DOS中FAT的前两项用来记录盘的类型。第2项起表示盘的分配和链接情况,在上例中第3项为“0表示对应的第3块空闲。图7-2还指出了文件A依次存放在第2,4,20,21,45,46块中,指针为FFF时表示文件结束。可见,MS-DOS的FA

5、T表起了两个作用:一是起到位示图的作用,可从中判别哪些块被占用,哪些块是空闲的;二是指出了文件的链接情况。(3) 假定磁盘存储空间共有32个物理块,模拟设计文件定位表FAT。文件定位表可以用一个一维数组FAT031来定义,其中一个元素与一个物理块对应。当FATi=0时,表示第i块为空闲块;当FATi=FFF时,表示链接文件到第i块结束;当FATi¹0LFATi¹FFF时,其值指示链接文件中下一个物理块号。(4) 假定磁盘上的每个物理块只能存放一个逻辑记录,设计一个程序把文件的逻辑结构模拟转换成MS-DOS的链接结构。用户要求保存一个已经在主存中的文件时,给出文件名和文件的逻

6、辑记录长度及个数,对一个已经保存的文件,允许用户插入新记录。用键盘输入来模拟用户的要求,输入信息为:“存” 文件名 逻辑记录长度 逻辑记录个数“插入” 文件名 逻辑记录号“插入”要求中的逻辑记录号是指在该记录后插入一个新记录。模拟程序的算法如图7-3。在设计的模拟程序中可不执行“逻辑记录存入物理块”的工作,而用显示文件目录表和FAT来代替。  图7-3 构造链接文件的模拟算法 (5) 可假设系统中已经有两个链接文件,其链接情况由FAT表指出(链接情况学生自定),现又要保存一个新文件,然后对已保存的文件插入一个新记录。运行你所设计的程序,观察其结果。第二题:模拟便于

7、直接存取的索引文件结构。提示:(1) 有时用户希望不按逻辑记录顺序而直接访问文件中的任意一个逻辑记录。在MS-DOS的链接结构中只需沿链查FAT表就可找到指定记录的物理地址。为了能更快地直接查找指定记录,可考虑另一种文件存储结构,即索引文件结构。索引文件像链接文件一样,文件的逻辑记录信息可存放在非连续的磁盘存储空间中。但这些存放逻辑记录的存储空间不是按链表的形式链接在一起的,而是采用索引表来指出逻辑记录存放的物理位置。假定把文件中的逻辑记录按次序1,2,3,4,编号,且约定一个物理块中存放一个逻辑记录,那么,索引表的格式根号图7-4。文件中的每一个逻辑记录在索引表中都有一个登记项,登记项指出逻

8、辑记录号以及该记录存放在磁盘上的地址(可用物理块号表示),“最大记录号”表示文件中逻辑记录个数。一个用户建立多个文件时,系统要为每个文件建立一张索引表,索引表的存放地址登记在用户文件目录表中。于是当用户要访问指定文件的某个记录时,系统就能直接查到该记录的物理位置。文件目录与索引表的关系如图7-4。   图7-4 索引文件结构 (2) 一般说来,索引表按记录顺序排列后,既有利于采用顺序存取方式访问文件,又便于采用直接存取方式访问文件。建立索引文件的过程是:寻找一些空闲物理块;逻辑记录存入这些物理块中;把逻辑记录与物理块的对应关系登记在索引表中。在模拟实习中

9、可只模拟索引表的构造,要求把第一题中已经建立的若干个链接文件(它们的链接情况由FAT表指出)变换成索引文件的结构。请设计一个文件存储结构的转换程序,要求能显示转换前的FAT表和转换后的索引表。四、相关数据结构及说明 1、定义链接文件数据结构以及文件定位表数组和空闲空间struct FILEINFOchar name10;/文件名int start; 文件存储开始位置int length;/文件内容占据长度 ; FILEINFO file10;int FATN,freespace;五、源代码及注释#include<stdlib.h>#include<stdio.h>#in

10、clude<string.h>#include<malloc.h>#define FDF -1#define FFF -2 #define N 32int filenumber;struct FILEINFOchar name10;int start;int length; ; FILEINFO file10;/文件结构体数组定义 int FATN,freespace;/FAT和空闲空间 /显示文件目录 void printfmenu() int i; printf("t文件个数:%d n",filenumber); printf("t文件

11、名 起始块号 文件长度n"); for(int i=0;i<filenumber;i+) printf("%s%d%d n",,filei.start,filei.length); /显示FAT表void printFAT()int i;printf("t空闲块数:%d n",freespace); printf("t-2代表FDF,-1代表FFFn"); for(int i=0;i<N;i+) printf("No.%d%d n",i,FATi); /搜索文件 void

12、search(char *tmpname) for(int i=0;i<filenumber;i+) if(strcmp(,tmpname)=0) printf("找到该文件n"); printf("t文件名 起始块号 文件长度n"); printf("%s%d%d n",,filei.start,filei.length); else printf("不存在该文件n"); /搜索索引点 void search2(int searchpoint) int i=0; in

13、t m; if(FATsearchpoint=0) printf("该点空缺,没有文件n"); else if(FATsearchpoint=-1&&FATsearchpoint-1=-2|FATsearchpoint+1=-1) printf("此处为系统空间!n"); else if(FATsearchpoint=-1&&FATsearchpoint+1=0) printf("找到该文件,此处的文件名为:%s",); else if(FATsearchpoint!=0&&

14、amp;FATsearchpoint+1!=-1) for( m=searchpoint;m+) if(FATm=-1) printf("找到该文件,此处的文件名为:%s",); else printf("找不到该文件n"); break; if(FATsearchpoint!=0&&FATsearchpoint+1=-1) printf("找到该文件,此处的文件名为:%s",); /写入文件 void write(char *tmpname,int tmplength) int

15、 last,i,j; strcpy(,tmpname); filefilenumber.length=tmplength; for(i=2;i<N;i+) if(FATi=0) filefilenumber.start=i; last=i; FATlast=FFF; break; for(i=1;i<tmplength;i+) for(j=2;j<N;j+) if(FATj=0) FATlast=j; last=j; FATlast=FFF; break; FATlast=FFF; freespace-=tmplength; filenu

16、mber+; printf("文件名和长度:%s%dn",tmpname,tmplength); /插入文件 void insert(char *tmpname,int insertpoint) int i; int last,brpoint; for(i=0;i<filenumber;i+) if(strcmp(,tmpname)=0) last=i; break; if(insertpoint>=filelast.length) printf("插入点溢出!"); return; brpoint=filelast.st

17、art; for(int i=0;i<insertpoint;i+) brpoint=FATbrpoint; for(i=0;i<N;i+) if(FATi=0) FATi=FATbrpoint; FATbrpoint=i; break; filelast.length+; freespace-; printf("文件名和长度:%s%dn",tmpname,filelast.length); int main() int i; char tmpname10; int tmplength; int m; filenumber=0; for(i=0;i<N;i

18、+) FATi=0; FAT0=FDF; FAT1=FFF; freespace=98; while(true) printf("n"); printf("*欢迎进入*n"); printf("<<<<<<模拟DOS文件的建立和使用>>>>>n"); printf("0 退出n1 写入文件n2 插入文件n3 显示文件目录n4 显示FAT表n5 搜索文件n6 搜索索引点n");printf("*nn");printf("选择服务菜单:");scanf("%d",&m);switch(m)case 0:exit(0);case 1:printf("输入要写入的文件名:");scanf("%s",&tmpname); printf("输入要写入的文件长度:");scanf("%d",&tmplength); write(tmpname,tmplength)

温馨提示

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

评论

0/150

提交评论