模拟磁盘文件管理的程序.docx

上传人:b****8 文档编号:13143589 上传时间:2023-06-11 格式:DOCX 页数:19 大小:155.99KB
下载 相关 举报
模拟磁盘文件管理的程序.docx_第1页
第1页 / 共19页
模拟磁盘文件管理的程序.docx_第2页
第2页 / 共19页
模拟磁盘文件管理的程序.docx_第3页
第3页 / 共19页
模拟磁盘文件管理的程序.docx_第4页
第4页 / 共19页
模拟磁盘文件管理的程序.docx_第5页
第5页 / 共19页
模拟磁盘文件管理的程序.docx_第6页
第6页 / 共19页
模拟磁盘文件管理的程序.docx_第7页
第7页 / 共19页
模拟磁盘文件管理的程序.docx_第8页
第8页 / 共19页
模拟磁盘文件管理的程序.docx_第9页
第9页 / 共19页
模拟磁盘文件管理的程序.docx_第10页
第10页 / 共19页
模拟磁盘文件管理的程序.docx_第11页
第11页 / 共19页
模拟磁盘文件管理的程序.docx_第12页
第12页 / 共19页
模拟磁盘文件管理的程序.docx_第13页
第13页 / 共19页
模拟磁盘文件管理的程序.docx_第14页
第14页 / 共19页
模拟磁盘文件管理的程序.docx_第15页
第15页 / 共19页
模拟磁盘文件管理的程序.docx_第16页
第16页 / 共19页
模拟磁盘文件管理的程序.docx_第17页
第17页 / 共19页
模拟磁盘文件管理的程序.docx_第18页
第18页 / 共19页
模拟磁盘文件管理的程序.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

模拟磁盘文件管理的程序.docx

《模拟磁盘文件管理的程序.docx》由会员分享,可在线阅读,更多相关《模拟磁盘文件管理的程序.docx(19页珍藏版)》请在冰点文库上搜索。

模拟磁盘文件管理的程序.docx

模拟磁盘文件管理的程序

模拟磁盘文件管理的程序

一、课程设计内容

⑴自定义磁盘文件管理的数据结构;

⑵能够自由创建、修改、删除文件;

⑶文件具有一定自定义的属性;

⑷能够显示当前系统文件的状态。

二、课程设计的数据结构说明

程序中定义了两个类:

classfile//文件类

{private:

charname[10];//文件名

public:

inttag;//删除标记1:

已删0:

未删

file(){}

char*getname(){returnname;}//获取文件名

intgettag(){returntag;}//获取删除标记

intgetlength(){returnlength;}//获取文件大小

intgetblocknum(){returnblocknum;}//磁盘块数

intgetblocksum1(){returnblocksum1;}//磁盘块号的始点

intgetblocksum2(){returnblocksum2;}//磁盘块号的终点

intlength,blocknum,blocksum1,blocksum2;

voidsetname(charna[]){strcpy(name,na);}//设置文件名

voiddelwenjian(){tag=1;}//设置删除标记1:

已删0:

未删

voidcreatfile(char*na,intL,intnum,ints1,ints2)//创建文件

voiddeltefile(char*na){tag=1;strcpy(name,na);}//删除文件

voiddisp()//输出文件信息

classfdatabase//文件库类

{private:

inttop;//文件记录指针

filef[50];

public:

fdatabase(){top=-1;}//构造函数

intsearch(char*fname)//按文件名查找

intcreatfile(char*na,intL,intnum,ints1,ints2)//创建文件时先查找是否存在

intdeltefile(char*na)//删除文件时先查找是否存在

voiddisp()//输出所有文件信息

};

 

三、课程设计的模板说明

1、初始化,建立文件系统

输入磁盘大小(G),每个盘块大小(M),自动建立位示图,位示图字长定为32位

输出位示图的行数,以及行号、列号与磁盘块号的转换公式(都从0开始编号)。

2、循环选择执行以下功能

1、存储文件

输入建立的文件名和文件大小,如果该文件名已经存在,则输出不能建立的信息否则计算所需的磁盘块数

为其分配足够多的磁盘块,并记录下来

输出所占用的磁盘块号

2、删除文件

输入要删除的文件名,如果该文件名不存在,则输出删除错误信息,否则收回该文件所占用的磁盘块

删除该文件名

3、显示位示图情况

显示位示图的情况

显示剩余磁盘块的数目

4、显示文件列表

显示文件名,文件大小,占用的磁盘块数目和磁盘块号

四、课程设计的源代码

#include

#include

#include

#include

#include

inti=0,j=0,sum=0,tt=0,r,ii,k,g,m;

inta[100][32];

classfile//文件类

{private:

intno;//文件编号

charname[10];//文件名

public:

inttag;//删除标记1:

已删0:

未删

file(){}

char*getname(){returnname;}//获取姓名

intgettag(){returntag;}//获取删除标记

intgetno(){returnno;}//获取文件编号

intgetlength(){returnlength;}//获取文件大小

intgetblocknum(){returnblocknum;}//磁盘块数

intgetblocksum1()//磁盘块号的始点

{returnblocksum1;}

intgetblocksum2()//磁盘块号的终点

{returnblocksum2;}

intlength;//文件大小

intblocknum;//盘块数

intblocksum1;//所占盘块号的始点

intblocksum2;//所占盘块号的终点

voidsetname(charna[])//设置文件名

{strcpy(name,na);}

voiddelwenjian(){tag=1;}//设置删除标记1:

已删0:

未删

voidcreatfile(char*na,intL,intnum,ints1,ints2)//创建文件

{tag=0;

length=L;

blocknum=num;

blocksum1=s1;

blocksum2=s2;

strcpy(name,na);

blocknum=length/m;//盘块数=文件大小/盘块大小

if(length%m!

=0)//盘块数取上整

blocknum=blocknum+1;

cout<<"所需磁盘块数:

"<

if((sum+blocknum)<=32)//所有盘块数只占用一行,直接赋值

{for(;j<(sum+blocknum);j++)

a[i][j]=1;

sum=sum+blocknum;//再进行下面文件的盘块数累加

}

else

{//占用多行,先赋值整行

for(;j<32;j++)

a[i][j]=1;

i=i+1;

for(j=0;j<(sum+blocknum)-32;j++)//再进行剩余项赋值

{

a[i][j]=1;

}

sum=sum+blocknum-32;

}

tt=tt+blocknum;//输出文件所占用的盘块号

cout<<"所占磁盘块号:

"<

blocksum1=tt-blocknum;

blocksum2=tt-1;

}

voiddeltefile(char*na)//删除文件

{tag=1;

strcpy(name,na);

}

voiddisp()//输出文件信息

{cout<

};

classfdatabase//文件库类

{private:

inttop;//文件记录指针

filef[50];

public:

fdatabase()//构造函数

{top=-1;}

intsearch(char*fname)//按文件名查找

{

for(ii=0;ii<=top;ii++)

{if(strcmp(f[ii].getname(),fname)==0&&f[ii].tag==0)

return0;

}

return1;

}

intcreatfile(char*na,intL,intnum,ints1,ints2)//创建文件时先查找是否存在

{intp;

p=search(na);

if(p==1)

{top++;

f[top].creatfile(na,L,num,s1,s2);

return1;}

else

{cout<<"!

!

!

该文件已存在,不能创建!

!

!

\n\n";

return0;}

}

intdeltefile(char*na)//删除文件时先查找是否存在

{intb,p,x=0,n1,n2,q1,q2,t;

p=search(na);

if(p==0)//若文件存在

{//进行删除文件赋值

f[ii].tag=1;

b=f[ii].length/m;//盘块数=当前文件大小/盘块大小

if(ii==0)//对第一个删除文件进行赋值

for(k=0;k

a[x][k]=0;

else{

n1=(f[ii-1].blocksum2+1)/32;//被查找的文件之前文件所占用的盘块数/32,//大于0表示跨行

n2=(f[ii].blocksum2+1)/32;//所有文件所占用的盘块数/32,大于0表示跨行

q1=(f[ii-1].blocksum2+1)-n1*32;//当前文件的开始盘块号

q2=(f[ii].blocksum2+1)-n2*32;//用于跨行后计算盘块号

t=n2-n1;

if(t==0)//若n2与n1相等,表明当前所有被占用盘块在同一行

for(k=q1;k<1+b;k++)

a[n2][k]=0;

else

{if((f[ii-1].blocksum2+1)%32==0)//前面所占用的盘块数是32倍数

{x=x+n1;//当前文件赋值

for(;t-1>=0;t--,x++)//循环进行整行赋值

for(k=0;k<32;k++)

a[x][k]=0;

x=n2;//对剩余项赋值

for(k=0;k

a[x][k]=0;

}

else//对当前文件前几项赋值

{x=n1;

for(k=q1;k<32;k++)

a[x][k]=0;

x=x+1;

intt1=t;

for(;t-1>0;t--,x++)//中间整行赋值

for(k=0;k<32;k++)

a[x][k]=0;

x=n2;//最后剩余项赋值

for(k=0;k<(f[ii].blocksum2+1)-t1*32;k++)

a[x][k]=0;

}

}

return1;}

}

else

{cout<<"该文件不存在";

return0;}

}

voiddisp()//输出所有文件信息

{

for(inti=0;i<=top;i++)

if(f[i].tag==0)

f[i].disp();

}

};

voidbit_map(intI)

{

ints=0;

cout<<"---------------------------------------------------------------"<

for(intp=0;p

{for(intq=0;q<32;q++)

cout<

cout<

}

out<<"----------------------------------------------------------------"<

for(intp1=0;p1

for(intq1=0;q1<32;q1++)

if(a[p1][q1]==1)

s=s+1;

s=(g*1024)/m-s;

cout<<"剩余盘块数:

"<

}

voidmain()

{intI,l,b,i,j,ss1,ss2,sum=0;

charfname[20];

fdatabasep;

filew;

cout<<"\t\t************************************************\n";

cout<<"\t\t**\n";

cout<<"\t\t*初始化,建立文件系统*\n";

cout<<"\t\t**\n";

cout<<"\t\t************************************************\n";

cout<<"请输入磁盘大小GB:

";

cin>>g;

cout<

cout<<"请输入盘块大小MB:

";

cin>>m;

cout<

I=(g*1024)/(32*m);

for(i=0;i

for(j=0;j<32;j++)

a[i][j]=0;

cout<<"建立的位示图为:

"<

bit_map(I);

cout<<"行数:

"<

cout<<"\t\t************************************************\n";

cout<<"\t\t**\n";

cout<<"\t\t*行号、列号与磁盘块号的转换公式为:

*\n";

cout<<"\t\t*磁盘块号=行号*32+列号*\n";

cout<<"\t\t*行号=磁盘块号/32*\n";

cout<<"\t\t*列号=磁盘块号%32*\n";

cout<<"\t\t**\n";

cout<<"\t\t************************************************\n";

charchoice;

while(choice!

='0')

{cout<<"\t\t************************************************\n";

cout<<"\t\t**\n";

cout<<"\t\t*文件管理系统*\n";

cout<<"\t\t**\n";

cout<<"\t\t************************************************\n";

cout<<"\t\t\t1存储文件\n\n\t\t\t2删除文件\n\n\t\t\t3显示位示图情况\n\n\t\t\t4显示文件列表"<

cout<<"请输入选择项:

";

cin>>choice;

cout<

switch(choice)

{

case'1':

cout<<"请输入文件名:

";

cin>>fname;

cout<

intq;

q=p.search(fname);

if(q==0)

{cout<<"!

!

!

该文件已存在,不能创建!

!

!

\n\n";

break;

}

cout<<"请输入文件大小MB:

";

cin>>l;

cout<

if(l>g*1024)

{cout<<"!

!

!

文件大小超过磁盘最大容量,无法进行分配!

!

!

"<

break;}

p.creatfile(fname,l,b,ss1,ss2);

break;

case'2':

cout<<"请输入文件名:

";

cin>>fname;

cout<

q=p.search(fname);

if(!

q==0)

{

cout<<"!

!

!

该文件不存在,无法删除!

!

!

\n\n";

break;

}

p.deltefile(fname);

break;

case'3':

cout<<"\t\t**************显示位示图如下*********************\n";bit_map(I);

cout<

break;

case'4':

cout<<"\t\t*************文件列表如下************************\n";

cout<<"---------------------------------------------------------------"<

cout<

p.disp();

cout<

break;

default:

cout<<"输入错误,请从新输入:

\n\n";

break;

}

}

}

五、课程设计程序运行结果

1、初始化,建立文件系统

(1)用户根据提示输入磁盘大小(GB)与每个盘块大小(MB);

(2)程序首先根据用户输入的磁盘大小(GB)与每个盘块大小(MB),自动建立位示图,即初始化位示图,位示图每一行长度固定为32位(即列固定为32);位示图中每一位表示一个盘块,取值0和1分别表示空闲和占用。

初始化的位示图应全为0;

(3)程序再输出位示图的剩余盘块数,行数,以及行号、列号与磁盘块号的转换公式

(行列皆从0开始编号);

这样,初始化,建立文件系统完成。

运行结果:

2、选择执行:

存储文件,删除文件,显示位示图情况,显示文件列表

【显示文件管理系统列表】显示文件系统管理列表,并提示输入信息1——4。

用户输入文件操作命令1(存储文件),2(删除文件)、3(显示位示图情况)、4(显示文件列表);

格式如下:

键入1,创建文件名为fname,大小为L(MB)的文件;

键入2,删除文件名为fname的文件;

键入3,显示位示图情况;

键入4,显示所有文件信息。

运行结果:

【存储文件】

用户输入文件操作命令是1(存储文件)。

系统提示你输入你要建立的文件名和文件大小,如果该文件名已经存在,则系统提示输出不能建立此文件的信息,否则计算所需的磁盘块数和所占用的磁盘块号,并输出结果。

相应的在位示图上,因为位示图是矩阵,可以用数组存储,根据所占用的磁盘块号和公式:

磁盘块号=行号*32+列号

行号=磁盘块号/32

列号=磁盘块号%32

计算出文件占用的磁盘块在位示图上的位置,现在是创建文件,所以将位示图该位置上的二进制数置1,表示已分配出去。

分别创建名为ll,zz和mm三个文件,文件大小分别为224MB,320MB和56MB。

此时对应的位示图如下:

文件列表如下:

若再创建一个已经创建过的文件,则显示如下信息:

若创建的文件大小超过磁盘的最大容量,则显示如下信息:

【删除文件】

用户输入文件操作命令是2(删除文件)。

系统提示你输入要删除的文件名,如果该文件名不存在,则输出删除出错信息。

在位示图上,根据所占用的磁盘块号和公式:

磁盘块号=行号*32+列号

行号=磁盘块号/32

列号=磁盘块号%32

计算出文件占用的磁盘块在位示图上的位置,现在是删除文件,所以将位示图该位置上的二进制数置0,表示收回该文件所占用的磁盘块。

删除第二个文件zz,结果如下:

则相应的位示图和文件列表变为:

若删除一个不存在的文件,则显示如下信息:

【显示位示图情况】

如果用户输入文件操作命令是我wst()(显示位示图情况),系统输出此时位示图的情况,状态位为'0'表示对应盘块空闲,状态位为'1'表示该盘块已被分配出去。

系统再显示剩余磁盘块的数目。

以下是删除zz文件,创建xx后和创建xx后,删除ll的位示图:

【显示文件列表】

如果用户输入文件操作命令是disp()(显示所有文件情况),系统会显示所有文件的文件名,文件大小,占用的盘块数和盘块号。

以下是删除zz文件,创建xx后和创建xx后,删除ll显示的文件列表:

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2