实验八实验报告模拟

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验八模拟DOS文件的建立

一、上机目的:

磁盘文件是磁盘上存储的重要信息,通过本实验模拟DOS 文件的建立和使用情况,理

解磁盘文件的物理结构。文件管理是操作系统中重要的内容之一,不同的文件系统提供了不

同的物理结构,通过实验,深入理解文件的物理结构与存取方法之间的关系,以便更好的掌

握文件系统的概念。

二、上机内容:

(1)模拟设计DOS 操作系统中磁盘文件的存储结构

(2)模拟设计便于直接存取的索引文件结构

三、开发环境

Microsoft Visual C++ 环境,采用 C 语言编程

四、分析设计

(一)实验原理

(1)模拟设计DOS操作系统中磁盘文件的存储结构

DOS操作系统对磁盘文件的管理采用链接结构,将所有的链接指针集中在一起,存放在

文件分配表(FAT)中。连接文件的第一个物理块号登记在文件目录中。其设计思想是:假

定磁盘上共有N个物理块可供使用,当要存放文件时,从FAT表中寻找其值为0的项,用其对

应的物理块存放文件信息,并把文件占有的各物理块用链接指针登记在FAT表中,再把文件

的第一个物理块号登记在文件目录中。在DOS中FAT表的前两项用来记录磁盘的类型。而从第2项开始记录磁盘的分配情况和文件各物理块的链接情况。在FAT表中第三项的值如果为0,表示对应的第三块空闲。

假设磁盘空间共有100 个物理块,设计一个文件分配表FAT[100], 其中每一个元素与一

个物理块对应。开始时,先把FAT[100] 初始化为0,前两项是用来记录磁盘的类型,所以赋

常值分别为-2,-1 。然后再写入文件,假设写入的文件为A,文件长度为6, 要把这个文件写

入磁盘,就要为这个文件分配六个物理块,所以在FAT[100] 表中,找到六个空闲的物理块

分配给文件A,系统就能够在磁盘上正确的保存文件A。当你要给文件 A 在指定的位置添加

记录时,系统就要先找到一个空闲的物理块,然后把指定位置的物理块的值赋值给找到的空

闲块,然后再把插入的记录插在原先指定的物理块上。这样做是为了不把在指定位置的值给覆盖掉,又能正确的插入。

(2)模拟设计便于直接存取的索引文件结构

在MS-DOS 中通过文件目录,再沿着链查找FAT表,便可直接找到指定逻辑记录对应的物理块。在小型机或更高级的文件系统中,直接存取文件的方法是为每个文件建立一个索引表,指出各逻辑记录与物理块的对应关系。

在你要索引文件时,search()函数就能够通过比较你输入的文件名是否和你之前建立

的文件名相同,如果相同,就会索引出该文件,并且显示该文件的文件名、起始块号、文件

长度的详细信息;如果不相同,就会输出“找不到该文件”,

在索引索引点时,就要用search2 ()函数就通过输入的索引点是否为文件存储的最后

一个块而且输入的索引点的下一个物理块为0,就可以把文件索引出来。

五、参考代码:

#include // 使用字符串函数时需要的头文件

#include

#include

const int FDF=-2;

const int FFF=-1;

const int N=100;

int filenumber;

struct FILEINFO// 声明一个结构体类型

{

char name[10];// 文件名为字符串

int start;// 起始块号为整形

int length;// 文件长度为整形

};

FILEINFO file[10];// 定义结构体数组,file 是结构体数组名,10 为数组长度

int FAT[N],freespace; //FAT 表和剩余空间

//显示文件目录

void printfmenu()// 定义无参数返回值的printfmenu 函数

{

int i;// 定义变量i 为整形

printf("\t 文件个数:%d \n",filenumber);// 输出文件个数

printf("\t 文件名起始块号文件长度\n");// 输出文件名,起始块号和文件长度

for(i=0;i

{

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

}

}

//显示FAT 表

void printFAT()// 定义无参数返回值的printFAT 函数

{

int i;

printf("\t 空闲块数:%d\n",freespace);

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

for(i=0;i

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

}

}

//搜索文件

void search(char *tmpname)

{

int i;

for(i=0;i

{

if(strcmp(file[i].name,tmpname)==0)// 比较插入文件名与已存在文件名是否相同

{

printf("\t 找到了!\n");

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

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

}

else

{

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

}

}

}

//搜索索引点

void search2(int searchpoint)

{

int i=0;

int m;

if(FAT[searchpoint]==0)

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

else

相关文档
最新文档