模拟物理文件的存储过程连续文件串联文件索引文件文档格式.docx
- 文档编号:17614673
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:29
- 大小:181.99KB
模拟物理文件的存储过程连续文件串联文件索引文件文档格式.docx
《模拟物理文件的存储过程连续文件串联文件索引文件文档格式.docx》由会员分享,可在线阅读,更多相关《模拟物理文件的存储过程连续文件串联文件索引文件文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
⑶源程序的主要部分;
⑷测试用例,运行结果与运行情况分析;
⑸自我评价与总结。
时间安排:
设计安排3周:
查阅、分析资料1天
系统软件的分析与建模4天
系统软件的设计5天
系统软件的实现3天
撰写文档1天
课程设计验收答辩1天
设计验收安排:
设计周的第三周的指定时间到实验室进行上机验收。
设计报告书收取时间:
课程设计验收答辩完结时。
(注意事项:
严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名:
2013年12月10日
系主任(或责任教师)签名:
模拟物理文件的存储过程
——连续文件、串联文件、索引文件
1课程设计目的与功能
1.1设计目的
(1)阅读操作系统的文件管理章节内容,理解有关文件组织形式、文件存储的概念。
(2)掌握三种物理结构——顺序文件、串联文件和索引文件的存储。
(3)掌握一种计算机可视化语言的使用。
1.2设计功能
模拟采用指定结构对文件进行存储。
(1)能够输入给定的存储空间大小,文件的个数及大小;
(2)能显示出各文件占用空间的情况。
2需求分析,数据结构或模块说明(功能与框图)
2.1需求分析
由课设要求初步设计三种文件共享同一物理存储空间,所用的存储结构应同时满足三种结构的文件,若某一物理块已经被占用,则应该记录其已经被占用。
由于本次实验是模拟三种文件的存储过程,所以可以建一个主菜单,由用户来进行的操作,如显示文件的存储情况、显示剩余存储空间、创建新文件等。
如果要选择创建文件的操作,则显示一个二级菜单供用户选择。
用户可以指定创建的文件的个数,每一种文件的类型及大小。
并能够按照实验的要求显示出用户建立的文件所占用的空间情况。
设计处理以下情形:
(1)输入给定的存储空间大小
使用cout语句提示用户,输入给定的存储空间大小。
但要指定一最大值,用户输入给定存储空间大小后,要判断是否超过最大值,不能超过此范围,超出则提示用户重新输入。
(2)输入文件的个数和大小
让用户可以输入文件的个数和大小,即输入要创建几个文件、要创建的文件类型、每个文件的文件名以及文件的大小。
如果输入的大小不符合,应该能够提示用户文件大小超出规定值,不能创建,请重新输入文件大小,创建成功后则继续创建其它用户要求的文件。
(3)显示各文件占用空间的情况
将创建的各个文件的文件名、大小、占用空间情况显示。
串联空间在显示时要能够显示出所有的存储空间,要能显示出在物理上是非顺序的,要显示出过程;
索引文件是用一张索引表来存放文件所在的逻辑块号和物理块号,所以在显示的时候应该能够显示出它们之间的对应关系。
(4)创建的文件不重名
在输入名字完成后先判断该类型文件大小是否合适,是否有足够的或合适的空间来创建所需要的文件,然后判断该类型文件是否已经存在该文件名,存在则提示重新输入,再进行创建。
串联文件是用非连续的物理块来存放文件信息的,因此可以让用户输入起始地址后随机产生剩余的物理块。
索引文件是将文件的逻辑块号与物理块号放在一张索引表中,这张表也存放在一个物理块中,用户要输入索引表的地址。
而且在判断剩余空间是否足够的时候应该考虑到索引表也要占用一个物理块。
(5)显示剩余物理空间的情况
在初始化物理空间时各块未使用,创建文件后,有的物理块被使用了,设置使用标记,剩余未被使用的物理块应该可以显示出来。
2.2数据结构
2.2.1连续文件的结构体
连续文件是一种最简单的物理文件结构,它把一个在逻辑上连续的文件信息依次存放到物理块中。
连续文件结构如下图所示:
具体定义如下:
structlxfcb
{
stringname;
//文件名
intlength;
//文件长度
inthead;
//文件首地址
inttail;
//文件尾地址
intfull;
//1代表被占用,0代表未被占用
};
2.2.2串联文件的结构体
串联文件结构用非连续的物理块来存放文件信息。
这些非连续的物理块之间没有顺序关系。
其中每个物理块设有一个指针,指向其后续连接的另一个物理块,从而使得存放同一文件的物理块链接成一个串联队列。
串联文件的物理结构如下图:
串联文件的说明信息主要包括:
文件名、第一物理块号、文件长度、文件尾地址、此文件空间是否已被占用。
structclfcb
{stringname;
//文件名
//文件首地址
intlength;
//文件长度
intend;
//文件尾地址
intfull;
//1代表被占用,0代表未被占用
}c[10];
//定义一个串联文件的结构体数组,用来存放串联文件的文件信息,最多只能有10个串联文件。
2.2.3索引文件的结构体
系统为每个文件建立一张索引表,表中每一栏目指出文件信息所在的逻辑块号及与之对应的物理块号。
索引表的物理地址则由文件说明信息项给出。
其物理结构如下图:
索引文件的说明信息主要包括:
文件名、索引表、索引表物理块号、文件长度、此文件空间是否已被占用。
structindex
intin[10];
//索引表
intaddress;
//索引表地址
//文件长度
}ind[10];
//定义一个索引文件的结构体数组,用来存放索引文件的文件信息,最多只能有10个索引文件。
2.2.4物理空间的结构体
对于连续文件来说,创建文件时指定第一个物理块后,后面的每个物理块紧跟前一物理块,直到最后一个物理块。
对于串联文件来说,创建文件时指定第一个物理块后,后面的每个物理块由前一物理块的next指定,直到最后一个物理块。
对于索引文件来说,创建文件时,关键是对索引表进行修改,来指定对应的物理块。
每个逻辑块对应一个物理块,然后修改对应的物理块的使用情况,以完成文件的创建。
操作时不需要对next进行操作。
但为了使三种文件使用同一个物理空间,通过以下的方式实现存储空间的统一。
既能满足连续文件、串联文件又能满足索引文件。
structblock
{intkey;
//0表示未被占用,1表示已被占用
intnext;
//下一物理块的地址
}a[size];
2.3模块说明
此次模拟物理文件的存储过程,包括连续、串联和索引文件两种类型。
在设计程序时将程序分成了几个模块,以便让各模块的功能明确,各模块之间调用关系清晰。
以下是模块框图:
3源程序的主要部分
3.1程序流程图
3.2主要函数
以下是源程序的主要部分及功能简介如下:
(1)主函数intmain()
提醒用户输入给定的物理空间大小,然后调用init()函数初始化物理空间,和各类文件,再调用menu()函数,让用户选择要执行的操作,正常执行结束后返回值为1。
(2)初始化函数voidinit()
将给定的各物理块定义为未被占用,同时初始化各类文件,均为未被占用。
(3)主菜单函数voidmenu()
显示可以执行的各个功能供用户选择,当用户输入选择要执行的功能后,调用相应的函数完成用户要求。
(4)显示剩余物理块函数voidempty()
将物理空间中full=0的物理块显示出来,即输出未被占用的各个物理块。
(5)显示各文件占用空间情况函数voidshow()
将存在的文件占用物理空间的情况输出给用户,包括串联文件和索引文件。
串联文件要输出文件的说明信息,和具体占用物理块的组织形式;
索引文件要输出文件的说明信息和索引表信息。
(6)创建文件函数voidcreat()
判断用户要创建的文件类型,然后调用相应的函数创建用户想要建的文件。
(7)检测文件名是否存在函数intcheckname(stringname,inttype)
判断用户输入的文件名在同类型文件中是否已经存在,若存在或者输入类型不对,返回值为0,否则返回1。
(8)创建连续文件函数voidlx()
创建连续文件,从文件头指针依次占用物理块,并修改物理块的占用情况,确定文件的名字、长度、起始地址和结束地址。
(9)创建串联文件函数voidcl()
创建串联文件,修改占用物理块的指针,并修改物理块的占用情况,确定文件的名字、长度、起始地址和结束地址。
(10)创建索引文件函数voidindex()
创建索引文件,其中类型可继续分为一级索引及多级索引文件,修改物理块被占用的情况,修改索引表,确定各逻辑块对应的物理块,确定文件名、长度、索引表地址。
4测试用例,运行结果与运行情况分析
4.1测试用例
测试用例
文件类型
文件个数
文件名
文件大小
预期输出
T1
1(连续)
2
1
10
创建成功
5
T2
2(串联)
3
T3
3(索引)
2(一级)
(多级)
4
6
T4
7
提示错误
T5
15
8
T6
T7
9
50
4.2运行结果与运行情况分析
(1)给定存储空间大小,显示剩余存储空间
(2)输入测试用例T1
(3)输入测试用例T2
(4)输入测试用例T3
(5)输入测试用例T4
(6)输入测试用例T5
(7)输入测试用例T6
(8)输入测试用例T7
(9)输入测试用例T1,T2,T3后,显示剩余存储空间
(10)输入测试用例T1,T2,T3后,显示存储空间内的文件及存储地址
结合程序运行结果,可以看出程序的功能满足所要求设计的功能,实验结果均是正确的。
5自我评价与总结
6源程序
#include<
iostream>
string>
stdlib.h>
time.h>
//日期和时间头文件
usingnamespacestd;
#definesize1000
//*************************定义结构体******************
//定义连续文件结构体
structlxfcb
{
inttail;
//定义串联文件结构体
//文件长度
//定义索引文件结构体
structindexfcb
//物理空间的结构体
intkey;
//************************定义结构体*******************
intsize1;
intcount;
blocka[size];
//物理空间
lxfcbl[10];
clfcbc[10];
indexfcbind[10];
voidmenu();
//显示主菜单
voidempty();
//显示剩余空间
voidshow();
//显示存储空间内的文件及存储地址
voidcreat();
//创建文件
voidlx();
//创建连续文件
voidcl();
//创建串联文件
voidindex();
//创建索引文件
voidinit();
//初始化
intcheckname(stringname,inttype);
//检查是否重名及重名处理
intmain()
srand(time(NULL));
//以时间生成随机数
cout<
<
"
请给定存储空间的大小:
;
cin>
>
size1;
endl;
count=size1;
init();
menu();
return0;
}
voidmenu()//显示主菜单
****************模拟物理文件的存储过程***************"
*****1.显示剩余存储空间******"
*****2.显示存储空间内的文件及存储地址******"
*****3.创建新文件******"
*****4.退出******"
*****************************************************"
intm;
while
(1)
cout<
请输入操作序号:
cin>
m;
switch(m){
case1:
empty();
break;
case2:
show();
break;
case3:
creat();
case4:
exit
(1);
default:
Error"
};
menu();
}
voidinit()//初始化
inti,j;
for(i=0;
i<
i++)
a[i].key=0;
10;
for(j=0;
j<
j++)
ind[i].in[j]=-1;
l[i].full=0;
c[i].full=0;
ind[i].full=0;
voidempty()//显示剩余空间
intj=0;
剩余空间的个数是:
count<
剩余空间的地址是:
for(inti=0;
if(a[i].key==0)
{
j++;
cout<
"
if(j%10==0)//设置输出格式
cout<
}
intcheckname(stringname,inttype)//检查是否重名及重名处理
{
inti;
if(type==1){
for(i=0;
i++){
if(l[i].full==1)
if(!
strcmp(l[i].name.c_str(),name.c_str()))
return0;
//重名返回0
return1;
if(type==2){
if(c[i].full==1)
strcmp(c[i].name.c_str(),name.c_str()))
if(type==3){
if(ind[i].full==1)
if(!
strcmp(ind[i].name.c_str(),name.c_str()))
return0;
return1;
};
//类型不匹配也返回0
voidshow()//显示物理空间中所有的文件
inti,j,top;
连续文件目录:
//显示连续文件目录
名称\t起始位置\t结束位置\t长度\t存储空间"
if(l[i].full==1)
top=l[i].head;
l[i].name<
\t"
l[i].head<
l[i].tail<
l[i].length<
top<
->
for(j=1;
l[i].length-1;
{
a[top].next<
top=a[top].next;
}
l[i].tail<
串联文件目录:
//显示串联文件目录
top=c[i].head;
c[i].name<
c[i].head<
c[i].tail<
c[i].length<
c[i].length-1;
c[i].tail<
}
索引文件目录:
//显示索引文件目录
名称\t索引表位置\t长度"
ind[i].name<
ind[i].address<
ind[i].length<
ind[i].name<
文件的索引表为:
for(j=0;
ind[i].length;
--"
ind[i].in[j]<
voidcreat()//创建文件
****************创建文件***************"
***1.连续文件***"
***2.串联文件***"
***3.索引文件***"
***0.返回主菜单***"
***************************************"
ints;
{cout<
s;
switch(s){
lx();
cl();
index();
case0:
menu();
voidlx()//创建连续文件
intm,n,len;
intflag=0;
请输入所要创建连续文件个数:
if(m>
10)
文件个数不能超过10,错误!
for(n=1;
n<
m+1;
n++)
请输入第"
个文件的名称:
//检测文件名是否已经存在
do{
cin>
name;
ints=1;
checkname(name,s))
{cout<
文件已经存在请重新输入第"
flag=1;
elseflag=0;
}while(flag);
个文件的大小:
len;
while(len+1>
count||len>
30)
剩余空间不足或文件大小大于30"
请重新输入:
cin>
inti,j,h,num=rand()
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 物理 文件 存储 过程 连续 串联 索引