📄 文件管理.cpp
字号:
#include<iostream>
#include<string>
using namespace std;
#define n 30
#define m 30
#define minisize 120
struct file_user
{
string name;
float address;
float lentth;
int flag;
};file_user used_table[n];
struct file_left
{
string name;
float address;
float length;
int flag;
};file_left free_table[m];
void allocate(string nam, char job,float xk)//文件分配函数,为文件name分配大小为xk大小的块
{
int i,k;
float ad;
k=-1;
//采用最优分配算法分配xk大小的块
for(i=0;i<=m;i++)
if(free_table[i].length>=xk&&free_table[i].flag==1)
if(k==-1||free_table[i].length<free_table[k].length)//
k=i;
if(k==-1)
{
cout<<"文件分配失败!\n"<<endl;
return;
}
if(free_table[k].length-xk<=minisize)
{
free_table[k].flag=0;
ad=free_table[k].address;
xk=free_table[k].length;
}
else
{
free_table[k].length=free_table[k].length-xk;
ad=free_table[k].address+free_table[k].length;
}
//修改已分配的文件表
i=0;
while(used_table[i].flag!=0&&i<n) i++;
if(i>=n)//一分配文件表满
{
cout<<"没有空闲的文件!\n"<<endl;
//修正空闲文件表
if(free_table[k].flag==0)
free_table[k].flag=1;
else
{
free_table[k].length=free_table[k].length+xk;
return;
}
}
else//修改已分配文件表
{
used_table[i].address=ad;
used_table[i].lentth=xk;
used_table[i].flag=job;
used_table[i].name=nam;
}
return;
}
void reclaim(string job)//文件回收函数
{
int i,k,j,s=0,t;
float S,l;
while((used_table[s].name!=job||used_table[s].flag==0)&&s<n) s++;//寻找一分配分区表中对应的登记项
if(s>=n)
{
cout<<"该文件不存在,回收失败!\n"<<endl;
return;
}
used_table[s].flag=0;
//取得回收文件块的起事地址s和块的个数l
S=used_table[s].address;
l=used_table[s].lentth;
j=-1;
k=-1;
i=0;
//寻找回收空间的上下相邻文件块,上邻文件表目k,下邻文件表目j
while(i<m&&(j==-1||k==-1))
{
if(free_table[i].flag==1)
{
if(free_table[i].address+free_table[i].length==S)
k=i;//寻找到上邻空闲文件块
if(free_table[i].address==(S+l))
j=i;//寻找到下邻空闲文件块
}
i++;
}
if(k!=-1)
if(j!=-1)//合并三个空间为一个空间
{
free_table[k].length=free_table[j].length+free_table[k].length+l;
free_table[j].flag=0;
}
else free_table[k].length=free_table[k].length+l;
else if(j!=1)//将下邻空闲空间合并进来,组成一个新的空闲文件组块
{
free_table[j].address=S;
free_table[j].length+=l;
}
else
{
t=0;
while(free_table[t].flag==1&&t<m) t++;//在空闲文件块中寻找空栏目
if(t>m)
{
cout<<"没有空闲的文件块!\n"<<endl;
used_table[s].flag=used_table[s].flag;//恢复已分配文件表内容
return;
}
free_table[t].address=S;
free_table[t].length=l;
free_table[t].flag=1;
}
cout<<"文件回收成功!\n"<<endl;
return;
}
void main()//主函数
{
int i;
float xk;
char job;
string name;
free_table[0].address=10240;
free_table[0].length=102400;
free_table[0].flag=1;
for(i=1;i<m;i++)//空闲文件表初始化
free_table[i].flag=0;
for(i=1;i<n;i++)//已分配文件表初始化
used_table[i].flag=0;
while(true)
{
char a;
cout<<" ********************** 菜单 ******************* "<<endl;
cout<<" * 0-退出 1-文件分配; 2-文件回收 *"<<endl;
cout<<" * 3-浏览已分配的文件 *"<<endl;
cout<<" * 请选择(0--3) *"<<endl;
cout<<" ************************************************** "<<endl;
cin>>a;
if(a=='0') break;
switch(a)
{
case '1':
cout<<"请输入文件的名字..."<<endl;
cin>>name;
cout<<"请输入文件的标号...";
cout<<"注意:文件的标号是一个字符,否则系统会进入死循环!"<<endl;
cin>>job;
cout<<"请输入文件块的大小... "<<endl;
cin>>xk;
allocate(name,job,xk);
break;
case '2':cout<<"请输入你要回收的文件名... "<<endl;
cin>>name;
reclaim(name);
break;
case '3':
cout<<"已分配文件的信息如下: "<<endl;
cout<<"文件名 起始块 已用块的个数 标志"<<endl;
for(i=0;i<n;i++)
if(used_table[i].flag!=0)
cout<<used_table[i].name<<"\t\t"<<used_table[i].address<<"\t\t"<<used_table[i].lentth<<"\t\t"<<used_table[i].flag<<endl;
break;
default:cout<<"输入有误,请重新输入!"<<endl;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -