模拟物理文件的存储过程——连续文件、串联文件、索引文件.doc_第1页
模拟物理文件的存储过程——连续文件、串联文件、索引文件.doc_第2页
模拟物理文件的存储过程——连续文件、串联文件、索引文件.doc_第3页
模拟物理文件的存储过程——连续文件、串联文件、索引文件.doc_第4页
模拟物理文件的存储过程——连续文件、串联文件、索引文件.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

武汉理工大学系统软件课程设计说明书目 录课程设计任务书21课程设计目的与功能31.1设计目的31.2设计功能32需求分析,数据结构或模块说明(功能与框图)32.1 需求分析32.2数据结构42.2.1连续文件的结构体42.2.2串联文件的结构体52.2.3 索引文件的结构体62.2.4物理空间的结构体62.3模块说明73源程序的主要部分83.1程序流程图83.2主要函数94测试用例,运行结果与运行情况分析104.1测试用例104.2运行结果与运行情况分析115自我评价与总结156源程序16本科生课程设计成绩评定表32课程设计任务书学生姓名: 专业班级: 指导教师: 工作单位: 计算机科学与技术学院 题 目: 模拟物理文件的存储过程连续文件、串联文件、索引文件初始条件:1预备内容:阅读操作系统的文件管理章节内容,理解有关文件组织形式、文件存储的概念。2实践准备:掌握一种计算机可视化语言的使用。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1模拟采用指定结构对文件进行存储。能够处理以下的情形: 能够输入给定的存储空间大小,文件的个数及大小; 能显示出各文件占用空间的情况。2设计报告内容应说明: 课程设计目的与功能; 需求分析,数据结构或模块说明(功能与框图); 源程序的主要部分; 测试用例,运行结果与运行情况分析; 自我评价与总结。时间安排:设计安排3周:查阅、分析资料 1天系统软件的分析与建模 4天系统软件的设计 5天系统软件的实现 3天撰写文档 1天课程设计验收答辩 1天设计验收安排:设计周的第三周的指定时间到实验室进行上机验收。设计报告书收取时间:课程设计验收答辩完结时。(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)指导教师签名: 2013 年 12 月 10日系主任(或责任教师)签名: 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连续文件的结构体 连续文件是一种最简单的物理文件结构,它把一个在逻辑上连续的文件信息依次存放到物理块中。连续文件结构如下图所示:文件A第一物理块号(10)文件长度(4)文件说明信息逻辑块号 0 1 2 3 10 11 12 13 14 物理块号具体定义如下: struct lxfcb string name;/文件名 int length;/文件长度 int head;/文件首地址 int tail;/文件尾地址 int full;/1代表被占用,0代表未被占用;2.2.2串联文件的结构体 串联文件结构用非连续的物理块来存放文件信息。这些非连续的物理块之间没有顺序关系。其中每个物理块设有一个指针,指向其后续连接的另一个物理块,从而使得存放同一文件的物理块链接成一个串联队列。串联文件的物理结构如下图:串联文件的说明信息主要包括:文件名、第一物理块号、文件长度、文件尾地址、此文件空间是否已被占用。具体定义如下:struct clfcbstring name; /文件名int head; /文件首地址int length; /文件长度 int end; /文件尾地址int full; /1代表被占用,0代表未被占用c10; /定义一个串联文件的结构体数组,用来存放串联文件的文件信息,最多只能有10个串联文件。2.2.3 索引文件的结构体系统为每个文件建立一张索引表,表中每一栏目指出文件信息所在的逻辑块号及与之对应的物理块号。索引表的物理地址则由文件说明信息项给出。其物理结构如下图:索引文件的说明信息主要包括:文件名、索引表、索引表物理块号、文件长度、此文件空间是否已被占用。具体定义如下:struct index string name; /文件名int in10; /索引表int address; /索引表地址int length; /文件长度 int full; /1代表被占用,0代表未被占用ind10; /定义一个索引文件的结构体数组,用来存放索引文件的文件信息,最多只能有10个索引文件。2.2.4物理空间的结构体 对于连续文件来说,创建文件时指定第一个物理块后,后面的每个物理块紧跟前一物理块,直到最后一个物理块。对于串联文件来说,创建文件时指定第一个物理块后,后面的每个物理块由前一物理块的next指定,直到最后一个物理块。对于索引文件来说,创建文件时,关键是对索引表进行修改,来指定对应的物理块。每个逻辑块对应一个物理块,然后修改对应的物理块的使用情况,以完成文件的创建。操作时不需要对next进行操作。但为了使三种文件使用同一个物理空间,通过以下的方式实现存储空间的统一。既能满足连续文件、串联文件又能满足索引文件。具体定义如下:struct block int key;/0表示未被占用,1表示已被占用int next;/下一物理块的地址asize;2.3模块说明 此次模拟物理文件的存储过程,包括连续、串联和索引文件两种类型。在设计程序时将程序分成了几个模块,以便让各模块的功能明确,各模块之间调用关系清晰。以下是模块框图:主函数main()初始化init()主菜单menu()显示剩余存储空间empty()创建文件creat()显示文件占用空间情况show()退出exit()判断文件是否重名checkname()创建串联文件cl()创建索引文件index()创建连续文件lx()3源程序的主要部分3.1程序流程图开始输入给定空间大小size1size1100?Y初始化各物理块调用主菜单输入选项mm=?m=1显示剩余存储空间显示文件占用空间情况m=2创建文件剩余空间大于0YN是否有文件YN输入文件个数!=0m=3剩余空间=0?N文件类型菜单输入文件类型n创建串联文件创建索引文件n=2n=0n=3m=4结束程序YN创建连续文件n=13.2主要函数以下是源程序的主要部分及功能简介如下:(1) 主函数int main()提醒用户输入给定的物理空间大小,然后调用init()函数初始化物理空间,和各类文件,再调用menu()函数,让用户选择要执行的操作,正常执行结束后返回值为1。(2) 初始化函数void init()将给定的各物理块定义为未被占用,同时初始化各类文件,均为未被占用。(3) 主菜单函数void menu()显示可以执行的各个功能供用户选择,当用户输入选择要执行的功能后,调用相应的函数完成用户要求。(4) 显示剩余物理块函数void empty()将物理空间中full=0的物理块显示出来,即输出未被占用的各个物理块。(5) 显示各文件占用空间情况函数void show()将存在的文件占用物理空间的情况输出给用户,包括串联文件和索引文件。串联文件要输出文件的说明信息,和具体占用物理块的组织形式;索引文件要输出文件的说明信息和索引表信息。(6) 创建文件函数void creat()判断用户要创建的文件类型,然后调用相应的函数创建用户想要建的文件。(7) 检测文件名是否存在函数int checkname(string name,int type)判断用户输入的文件名在同类型文件中是否已经存在,若存在或者输入类型不对,返回值为0,否则返回1。(8) 创建连续文件函数void lx()创建连续文件,从文件头指针依次占用物理块,并修改物理块的占用情况,确定文件的名字、长度、起始地址和结束地址。(9) 创建串联文件函数void cl()创建串联文件,修改占用物理块的指针,并修改物理块的占用情况,确定文件的名字、长度、起始地址和结束地址。(10) 创建索引文件函数void index() 创建索引文件,其中类型可继续分为一级索引及多级索引文件,修改物理块被占用的情况,修改索引表,确定各逻辑块对应的物理块,确定文件名、长度、索引表地址。4测试用例,运行结果与运行情况分析4.1测试用例测试用例文件类型文件个数文件名文件大小预期输出T11(连续)2110创建成功25创建成功T22(串联)1310创建成功T33(索引)2 (一级) (多级)45创建成功56创建成功66创建成功T45175提示错误T511585提示错误T62115提示错误T711950提示错误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#include#include#include /日期和时间头文件using namespace std;#define size 1000/*定义结构体*/定义连续文件结构体struct lxfcb string name;/文件名 int length;/文件长度 int head;/文件首地址 int tail;/文件尾地址 int full;/1代表被占用,0代表未被占用;/定义串联文件结构体struct clfcbint length;/文件长度string name;/文件名int head;/文件首地址 int tail;/文件尾地址int full;/1代表被占用,0代表未被占用;/定义索引文件结构体struct indexfcbstring name;int in10;int address;int length; int full;/1代表被占用,0代表未被占用;/物理空间的结构体struct blockint key;/1代表被占用,0代表未被占用int next;/下一物理块的地址;/*定义结构体*int size1;int count;block asize;/物理空间lxfcb l10;clfcb c10;indexfcb ind10;void menu(); /显示主菜单void empty(); /显示剩余空间void show(); /显示存储空间内的文件及存储地址void creat(); /创建文件void lx(); /创建连续文件void cl(); /创建串联文件void index();/创建索引文件void init(); /初始化int checkname(string name,int type);/检查是否重名及重名处理int main()srand(time(NULL); /以时间生成随机数coutsize1;coutendl;count=size1;init();menu();return 0;void menu() /显示主菜单cout*模拟物理文件的存储过程*endl;cout* 1.显示剩余存储空间 *endl;cout* 2.显示存储空间内的文件及存储地址 *endl;cout* 3.创建新文件 *endl;cout* 4.退出 *endl;cout*endl;int m;while(1)coutm;switch(m) case 1: empty(); break; case 2: show();break; case 3: creat();break; case 4: exit(1); default: coutErrorendl;coutendl;menu();void init() /初始化 int i,j;for(i=0;isize1;i+)ai.key =0;for(i=0;i10;i+)for(j=0;j10;j+)indi.inj=-1;li.full =0;ci.full =0;indi.full=0;void empty() /显示剩余空间int j=0;coutendl;cout剩余空间的个数是:countendl;cout剩余空间的地址是:endl;for(int i=0;isize1;i+) if(ai.key=0)j+;couti ;if(j%10=0) /设置输出格式coutendl;coutendl;int checkname(string name,int type) /检查是否重名及重名处理 int i;if(type=1)for(i=0;i10;i+) if(li.full =1)if(!strcmp(.c_str(),name.c_str()return 0; /重名返回0 return 1; ;if(type=2)for(i=0;i10;i+) if(ci.full =1)if(!strcmp(.c_str(),name.c_str()return 0; /重名返回0 return 1; ;if (type=3)for(i=0;i10;i+) if(indi.full =1) if(!strcmp(.c_str(),name.c_str() return 0; return 1;return 0; /类型不匹配也返回0void show() /显示物理空间中所有的文件int i,j,top;coutendl;cout连续文件目录:endl;/显示连续文件目录cout名称t起始位置t结束位置t长度t存储空间endl;for(i=0;i10;i+)if(li.full=1)top=li.head; tli.head tli.tail tli.length t;couttop;for(j=1;jli.length-1;j+)coutatop.next;top=atop.next;coutli.tailendl;cout串联文件目录:endl;/显示串联文件目录cout名称t起始位置t结束位置t长度t存储空间endl;for(i=0;i10;i+)if(ci.full =1)top=ci.head; tci.head tci.tail tci.length t;couttop;for(j=1;jci.length-1;j+)coutatop.next;top=atop.next;coutci.tailendl;cout索引文件目录:endl;/显示索引文件目录cout名称t索引表位置t长度endl;for(i=0;i10;i+)if(indi.full =1) tindi.address tindi.length endl;for(i=0;i10;i+)if(indi.full =1)文件的索引表为:endl;for(j=0;jindi.length;j+)coutj-indi.injendl;void creat() /创建文件 cout*创建文件*endl;cout* 1.连续文件 *endl;cout* 2.串联文件 *endl;cout* 3.索引文件 *endl;cout* 0.返回主菜单 *endl;cout*endl;int s; while(1) couts;switch(s) case 1: lx( ); break; case 2: cl( ); break; case 3: index( ); break; case 0: menu( );break; default: coutErrorendl;void lx() /创建连续文件int m,n,len;string name;int flag=0;coutm;if(m10)cout文件个数不能超过10,错误!endl;coutm;for(n=1;nm+1;n+) cout请输入第nname;int s=1;if(!checkname(name,s) cout文件已经存在请重新输入第n个文件的名称:;flag = 1;else flag =0; while(flag); cout请输入第nlen; while(len+1count|len30) cout剩余空间不足或文件大小大于30endl; coutlen; int i,j,h,num=rand()%size1; for(i=0;i10;i+) if(li.full=0) break;=name;li.length=len; count-;li.full=1;li.head=num;li.tail=li.head;h=li.head;ah.key=1;for(j=0;jlen-1;j+)while(1) num+;if(anum.key=1)continue;break;anum.key=1;ali.tail.next=num;li.tail =num;count-;cout创建成功endl;creat();void cl() /创建串联文件 int m,n,len; string name;int flag=0; coutm;if(m10)cout文件个数不能超过10,错误!endl;coutm;for(n=1;nm+1;n+) cout请输入第nname;int s=1;if(!checkname(name,s) cout文件已经存在请重新输入第n个文件的名称:;flag = 1;else flag =0; while(flag); cout请输入第nlen; while(len+1count|len30) cout剩余空间不足或文件大小大于30endl; coutlen; int i,j,h,num;for(i=0;i10;i+)if(ci.full=0) break;=name;ci.length=len; count-;ci.full=1;ci.head=rand()%size1;ci.tail=ci.head;h=ci.head;ah.key=1;for(j=0;jlen-1;j+)while(1) num=rand()%size1;if(anum.key=1)continue;break;anum.key=1;aci.tail.next=num;ci.tail =num;count-;cout创建成功endl;creat();v

温馨提示

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

评论

0/150

提交评论