实验七 文件结构.docx

上传人:b****5 文档编号:11736370 上传时间:2023-03-31 格式:DOCX 页数:18 大小:195.28KB
下载 相关 举报
实验七 文件结构.docx_第1页
第1页 / 共18页
实验七 文件结构.docx_第2页
第2页 / 共18页
实验七 文件结构.docx_第3页
第3页 / 共18页
实验七 文件结构.docx_第4页
第4页 / 共18页
实验七 文件结构.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

实验七 文件结构.docx

《实验七 文件结构.docx》由会员分享,可在线阅读,更多相关《实验七 文件结构.docx(18页珍藏版)》请在冰豆网上搜索。

实验七 文件结构.docx

实验七文件结构

实习七文件结构

一、实习内容

把文件的逻辑结构转换成存储结构,设计便于顺序存取和直接存取的文件存储结构。

二、实习目的

文件的结构是指文件中信息的构造方式,通常分成逻辑结构和存储结构两种。

文件的逻辑结构是从用户的观点出发,研究用户概念中的信息组织方式,这时,把文件看成是若干个逻辑记录的集合。

文件的存储结构是指文件中的信息在物理存储介质上的存放方法和组织关系,这时,把文件看成是相关物理块的有序集合。

用户是按逻辑结构来生成和使用文件的,而文件系统必须按照存储设备的物理特性和用户对文件信息的存取方式来管理文件。

所以,文件系统一个主要任务就是要在文件的逻辑结构和存储结构之间建立一个映射。

本实习要求学生模拟设计文件的存储结构,通过实习理解文件的逻辑结构、存储结构、存取方式之间的联系。

三、实习题目

第一题:

模拟设计MS-DOS操作系统中磁盘文件的存储结构。

[提示]:

(1)当用户对记录式文件采用顺序存以方式时,用户总是依次地访问一个个逻辑记录,即当访问了第I个记录后,下次总是访问第i+1个记录。

所以,当用户采用顺序存取方式访问文件时,只要给出访问要求(读或写)而无需再指出要访问的记录号。

为了适应顺序存取,文件的存储结构可采用顺序文件或链接文件。

由于顺序文件必须占用连续的存储空间,为了提高存储空间的利用率,在用户按逻辑记录顺序访问文件的情况下,一般采用链接文件的结构。

链接文件可以存放在不连续的物理块中,使用链接字(又称指针)来指出文件中各个物理块之间的关联。

在一般情况下,链接文件的第一个物理块号登记在文件目录中,每一块中设置一个链接字,指出链接文件的下一个物理块号,最后一块中的链接字内容为“0”,表示文件结束。

链接文件结构如图7-1。

 

 

图7-1链接文件结构

 

(2)采用上述的链接文件结构,只有读出一个物理块信息后才能从链接字中得知下一个物理块号。

所以,当用户要在文件中插入一些信息时,文件系统必须多次地请求启动磁盘读出信息才能做插入工作。

MS-DOS操作系统对链接文件结构作了改进,它是把所有的链接指针集中在一起,存放在文件定位表FAT中。

查找链接字时不必读出物理块信息可直接从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的FAT表起了两个作用:

一是起到位示图的作用,可从中判别哪些块被占用,哪些块是空闲的;二是指出了文件的链接情况。

(3)假定磁盘存储空间共有32个物理块,模拟设计文件定位表FAT。

文件定位表可以用一个一维数组FAT[031]来定义,其中一个元素与一个物理块对应。

当FAT[i]=0时,表示第i块为空闲块;当FAT[i]=FFF时,表示链接文件到第i块结束;当FAT[i]0FAT[i]FFF时,其值指示链接文件中下一个物理块号。

(4)假定磁盘上的每个物理块只能存放一个逻辑记录,设计一个程序把文件的逻辑结构模拟转换成MS-DOS的链接结构。

用户要求保存一个已经在主存中的文件时,给出文件名和文件的逻辑记录长度及个数,对一个已经保存的文件,允许用户插入新记录。

用键盘输入来模拟用户的要求,输入信息为:

“存”文件名逻辑记录长度逻辑记录个数

“插入”文件名逻辑记录号

“插入”要求中的逻辑记录号是指在该记录后插入一个新记录。

模拟程序的算法如图7-3。

在设计的模拟程序中可不执行“逻辑记录存入物理块”的工作,而用显示文件目录表和FAT来代替。

 

 

图7-3构造链接文件的模拟算法

 

(5)可假设系统中已经有两个链接文件,其链接情况由FAT表指出(链接情况学生自定),现又要保存一个新文件,然后对已保存的文件插入一个新记录。

运行你所设计的程序,观察其结果。

第二题:

模拟便于直接存取的索引文件结构。

[提示]:

(1)有时用户希望不按逻辑记录顺序而直接访问文件中的任意一个逻辑记录。

在MS-DOS的链接结构中只需沿链查FAT表就可找到指定记录的物理地址。

为了能更快地直接查找指定记录,可考虑另一种文件存储结构,即索引文件结构。

索引文件像链接文件一样,文件的逻辑记录信息可存放在非连续的磁盘存储空间中。

但这些存放逻辑记录的存储空间不是按链表的形式链接在一起的,而是采用索引表来指出逻辑记录存放的物理位置。

假定把文件中的逻辑记录按次序1,2,3,4,……编号,且约定一个物理块中存放一个逻辑记录,那么,索引表的格式根号图7-4。

文件中的每一个逻辑记录在索引表中都有一个登记项,登记项指出逻辑记录号以及该记录存放在磁盘上的地址(可用物理块号表示),“最大记录号”表示文件中逻辑记录个数。

一个用户建立多个文件时,系统要为每个文件建立一张索引表,索引表的存放地址登记在用户文件目录表中。

于是当用户要访问指定文件的某个记录时,系统就能直接查到该记录的物理位置。

文件目录与索引表的关系如图7-4。

 

 

 

图7-4索引文件结构

 

(2)一般说来,索引表按记录顺序排列后,既有利于采用顺序存取方式访问文件,又便于采用直接存取方式访问文件。

建立索引文件的过程是:

寻找一些空闲物理块;逻辑记录存入这些物理块中;把逻辑记录与物理块的对应关系登记在索引表中。

在模拟实习中可只模拟索引表的构造,要求把第一题中已经建立的若干个链接文件(它们的链接情况由FAT表指出)变换成索引文件的结构。

请设计一个文件存储结构的转换程序,要求能显示转换前的FAT表和转换后的索引表。

四、相关数据结构及说明

1、定义链接文件数据结构以及文件定位表数组和空闲空间

structFILEINFO

{

charname[10];//文件名

intstart;文件存储开始位置

intlength;//文件内容占据长度

};

FILEINFOfile[10];

intFAT[N],freespace;

五、源代码及注释

#include

#include

#include

#include

#defineFDF-1

#defineFFF-2

#defineN32

intfilenumber;

structFILEINFO

{

charname[10];

intstart;

intlength;

};

FILEINFOfile[10];//文件结构体数组定义

intFAT[N],freespace;//FAT和空闲空间

//显示文件目录

voidprintfmenu()

{

inti;

printf("\t文件个数:

%d\n",filenumber);

printf("\t文件名起始块号文件长度\n");

for(inti=0;i

{

printf("%s%d%d\n",file[i].name,file[i].start,file[i].length);

}

}

//显示FAT表

voidprintFAT()

{

inti;

printf("\t空闲块数:

%d\n",freespace);

printf("\t-2代表FDF,-1代表FFF\n");

for(inti=0;i

{

printf("No.%d%d\n",i,FAT[i]);

}

}

//搜索文件

voidsearch(char*tmpname)

{

for(inti=0;i

{

if(strcmp(file[i].name,tmpname)==0)

{

printf("找到该文件\n");

printf("\t文件名起始块号文件长度\n");

printf("%s%d%d\n",file[i].name,file[i].start,file[i].length);

}

else

{

printf("不存在该文件\n");

}

}

}

//搜索索引点

voidsearch2(intsearchpoint)

{

inti=0;

intm;

if(FAT[searchpoint]==0)

printf("该点空缺,没有文件\n");

elseif(FAT[searchpoint]==-1&&FAT[searchpoint-1]==-2||FAT[searchpoint+1]==-1)

printf("此处为系统空间!

\n");

elseif(FAT[searchpoint]==-1&&FAT[searchpoint+1]==0)

printf("找到该文件,此处的文件名为:

%s",file[i].name);

elseif(FAT[searchpoint]!

=0&&FAT[searchpoint+1]!

=-1)

{

for(m=searchpoint;;m++)

{

if(FAT[m]==-1)

printf("找到该文件,此处的文件名为:

%s",file[i].name);

else

{

printf("找不到该文件\n");

}

break;

}

}

if(FAT[searchpoint]!

=0&&FAT[searchpoint+1]==-1)

printf("找到该文件,此处的文件名为:

%s",file[i].name);

}

//写入文件

voidwrite(char*tmpname,inttmplength)

{

intlast,i,j;

strcpy(file[filenumber].name,tmpname);

file[filenumber].length=tmplength;

for(i=2;i

{

if(FAT[i]==0)

{

file[filenumber].start=i;

last=i;

FAT[last]=FFF;

break;

}

}

for(i=1;i

{

for(j=2;j

if(FAT[j]==0)

{

FAT[last]=j;

last=j;

FAT[last]=FFF;

break;

}

}

FAT[last]=FFF;

freespace-=tmplength;

filenumber++;

printf("文件名和长度:

%s%d\n",tmpname,tmplength);

}

//插入文件

voidinsert(char*tmpname,intinsertpoint)

{

inti;

intlast,brpoint;

for(i=0;i

{

if(strcmp(file[i].name,tmpname)==0)

{

last=i;

break;

}

}

if(insertpoint>=file[last].length)

{

printf("插入点溢出!

");

return;

}

brpoint=file[last].start;

for(inti=0;i

{

brpoint=FAT[brpoint];

}

for(i=0;i

{

if(FAT[i]==0)

{

FAT[i]=FAT[brpoint];

FAT[brpoint]=i;

break;

}

}

file[last].length++;

freespace--;

printf("文件名和长度:

%s%d\n",tmpname,file[last].length);

}

intmain()

{

inti;

chartmpname[10];

inttmplength;

intm;

filenumber=0;

for(i=0;i

{

FAT[i]=0;

}

FAT[0]=FDF;

FAT[1]=FFF;

freespace=98;

while(true)

{

printf("\n");

printf("*****************欢迎进入**************\n");

printf("<<<<<<模拟DOS文件的建立和使用>>>>>\n");

printf("0退出\n1写入文件\n2插入文件\n3显示文件目录\n4显示FAT表\n5搜索文件\n6搜索索引点\n");

printf("***************************************\n\n");

printf("选择服务菜单:

");

scanf("%d",&m);

switch(m)

{

case0:

exit(0);

case1:

printf("输入要写入的文件名:

");scanf("%s",&tmpname);

printf("输入要写入的文件长度:

");scanf("%d",&tmplength);

write(tmpname,tmplength);break;

case2:

printf("输入要插入的文件名:

");scanf("%s",&tmpname);

printf("输入要插入的点:

");

intinsertpoint;

scanf("%d",&insertpoint);

insert(tmpname,insertpoint);break;

case3:

printfmenu();break;

case4:

printFAT();break;

case5:

printf("输入要搜索的文件名:

");scanf("%s",&tmpname);

search(tmpname);break;

case6:

printf("输入要搜索的索引点:

");

intsearchpoint;

scanf("%d",&searchpoint);

printf("输入要插入的点:

");scanf("%d",&insertpoint);

search2(searchpoint);break;

}

}

printFAT();

}

六、运行结果

1、题二运行结果

 

2、题一运行结果

 

(5)打印出初始的FAT表,运行第一题的程序得到的FAT表,以及转换成索引文件结构后的索引表。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 化学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1