⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 文件管理.cpp

📁 这是我用c++做的关于文件结构的实验算法
💻 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 + -