实验题目:采用空白文件目录结构管理磁盘空间,实现磁盘空间的分配和回收
#include"stdio.h"
#include"math.h"
#define N 5
char fname;
int xh;
struct freearea //空白文件目录,并初始化
{
int startaddress;//第一个空闲块
int size;//空闲块的块数
int state;//空闲区状态,0表示空表目,1为可用空块
char name[100]; //用来存放进入空白文件目录的文件名称
}freeblock[N]={{8,5,1,{NULL}},{15,4,1,{NULL}},{20,7,1,{NULL}},{30,8,1,{NULL}},{60,13,1,{NULL}}};
struct filemenu //文件目录表
{
char Fname; //文件名称
int size; //文件的大小
}FMenu[100];
int alloc(int applyarea)///为文件分配存储块的函数,磁盘空间的分配
{
int i,tag=0,j=0,flag=1;
for( i=0 ; i< N ; i++ )
//for( j = 0 ; j < 100 ; j++ )
if(freeblock[i].state==1 && freeblock[i].size > applyarea && flag==1 && freeblock[i].name[xh]==NULL)
{
freeblock[i].startaddress = freeblock[i].startaddress + applyarea;
freeblock[i].size=freeblock[i].size-applyarea;
tag=1;/*有满足条件的空闲区时,tag置1*/
flag=0;
//freeblock[i].name=FMenu[i].Fname;
freeblock[i].name[xh]=fname;
//printf("$$$$$ %c/n",freeblock[i].name);
return freeblock[i].startaddress-applyarea;
}
else
if(freeblock[i].state==1 && freeblock[i].size==applyarea && flag==1 && freeblock[i].name[xh]==NULL)
{
freeblock[i].startaddress = freeblock[i].startaddress + applyarea;
freeblock[i].size=freeblock[i].size-applyarea;
freeblock[i].state=0;
flag=0;
tag=1;/*有满足条件的空闲区时,tag置1*/
//freeblock[i].name=FMenu[i].Fname;
freeblock[i].name[xh]=fname;
//printf("******* %c/n",freeblock[i].name);
}
if(tag==0)
return -1;
}
void setfree()///实现磁盘空间的回收
{
int i,j,k;
char s;
printf("输入要删除的文件名: /n");
getchar();
scanf("%c",&s);
for(j=0;j<100 ;j++)
if(FMenu[j].Fname==s)
{
//printf("@@@ %c %d/n",FMenu[j].Fname,j);
break;
}
for(i=0;i<N;i++)
{
for(k=0;k<100;k++)
//printf("$$$$$ %c %d/n",freeblock[i].name,i);
if(freeblock[i].name[k]==s)
{
//printf("#### %c %d/n",freeblock[i].name,i);
freeblock[i].state=1;
freeblock[i].startaddress=freeblock[i].startaddress - ((int)ceil(FMenu[j].size*1.0/100)) ;
freeblock[i].size=freeblock[i].size + ((int)ceil(FMenu[j].size*1.0/100)) ;
}
}
}
void print()
{
int i;
printf(" |...................................................................|/n");
printf(" |序号..........第一个空白块.........连续空闲块个数.........状态.....|/n");
printf(" |...................................................................|/n");
for(i=0;i<N;i++)
{
printf(" |%3d..............%3d.......................%3d..........%3d........|/n",
i,freeblock[i].startaddress,freeblock[i].size,freeblock[i].state);
printf(" |...................................................................|/n");
}
}
void main()
{
int start,i,a,k,j,same=1;
//char name;
printf("分配前的空白文件目录: /n");
print();
printf("每个空闲块内存为100/n");
printf("可选择服务类型 /n");
printf("1 调入新的文件/n");
printf("2 收回文件磁盘空间 /n");
printf("3 退出 /n"); /*输出功能提示*/
printf("空闲区状态;0表示空表目,1为可用空块/n");
printf("请选择服务类型 /n");
scanf("%d",&a); /*读入选择的服务 */
xh=0;
while(a!=3)
{
if(a==1)
{
/*printf("分配前的空白文件目录: /n");
print();*/
same=1;
printf("输入文件名: /n");
getchar();
scanf("%c",&fname);
for(i=0;i<100;i++)
{
if(FMenu[i].Fname==fname)
{
printf("已经有这个名字的文件了,请从新输入/n");
same=0;
break;
}
}
if(same==1)
{
FMenu[xh].Fname=fname;
printf("输入所需磁盘大小: ");
scanf("%d",&FMenu[xh].size);
//k=(int)ceil(FMenu[i].size*1.0/100);
start=alloc((int)ceil(FMenu[xh].size*1.0/100));
if(start==-1)
printf("没有足够的内存,文件等候/n");
else
{
printf("分配后的空白文件目录: /n");
print();
}
xh++;
}
}
if(a==2)
{
setfree();
printf("删除后的空白文件目录: /n");
print();
}
printf("@@@@@请选择服务类型: /n");
scanf("%d",&a); /*读入选择的服务 */
}
}