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

📄 qiner.cpp

📁 本文件戏一个简单的文件系统模拟代码
💻 CPP
字号:
#include <iostream.h>
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
#include <time.h>


//************************************************
class empty_block;
class node   //物理块节点
{
public:
	friend class empty_block;
private:
	node(int d=0){physic_num=d;next=0;}
	node *next;        //下一个物理块
	int physic_num;   //物理块号
};
class empty_block  //物理块链表
{
public:
	empty_block(){linklist=0;}
	empty_block(int d){linklist=new node(d);}
	void Insert(int d=0);         //插入空闲物理块
	void Del_list(int d);         //删除物理块
	void print();    //串联结构存储时,输出每文件对应存储链中的值
private:
	node *End();         //最后一个空闲块
	node *linklist;
};

void empty_block::Insert(int d)      //插入物理块号d的空闲物理块
{
	node *pt=new node(d);
	if(linklist==0)
		linklist=pt;
	else
		(End())->next=pt;
}

node *empty_block::End()         //返回空闲链表的最后一个物理块
{
	node *prv,*pt;
	for(prv=pt=linklist;pt;prv=pt,pt=pt->next)
		;
	return prv;
}

void empty_block::Del_list(int d)   ////删除物理块号为d的物理块
{
	if(linklist==0)
		cout<<"empty!\n";
	else
	{
	   node *pt=linklist;
	   node *pr=linklist;
	   if(linklist->physic_num==d)
	       linklist=linklist->next;
	   else
	   {
		   while(pt->physic_num!=d && pt)
		   {
			   pr=pt;
			   pt=pt->next;
		   }
		   pr->next=pt->next;
		   pt->next=0;
	   }
	 }
}
void empty_block::print()   //输出每文件对应存储链中的值
{
	node *prv,*pt;
	for(prv=pt=linklist->next;pt;prv=pt,pt=pt->next)
	{
		cout<<pt->physic_num<<" ";
		pt=pt->next;
	}
	cout<<endl;
}
long Rand(int t)    //产生随机数
{
	srand( (unsigned)time( NULL ) ); 
   int i=rand()%(t)+1 ; 
   return i;
}

//***********************************************************
class List;
class Item   //索引表项
{
public:
	friend class List;
private:
	Item(int d=0,int e=0){physic_num=d;logic_num=e;next=0;}
	Item *next;
	int physic_num;//物理块号
	int logic_num;//逻辑块号
};
class List  //文件的索引表,对应FCB中的index
{
public:
	List(){list=0;}
	List(int e){list=new Item(e);}   //e为逻辑块号
	void print();
	void insert(int d=0,int e=0);
private:
	Item *end();
	Item *list;
};
void List::print()   //输出索引表中每个逻辑块对应的物理块号
{
	Item *pt=list;
	while(pt)
	{
		cout<<pt->physic_num<<" ";
		pt=pt->next;
	}
}
void List::insert(int d,int e)  //插入逻辑块号为e和物理块号为d的索引项到索引表的最后
{
	Item *pt=new Item(d,e);
	if(list==0)
		list=pt;
	else
		(end())->next=pt;
}
Item *List::end()        //索引表的最后一个索引项
{
	Item *prv,*pt;
	for(prv=pt=list;pt;prv=pt,pt=pt->next)
		;
	return prv;
}

//************************************************
class FCB        //文件控制块类
{
public:
	friend void change(FCB &q);
	FCB(){size=0;firstblock=0;flag=0;}  
	void print1(){Index.print();} //打印文件对应索引表中每个逻辑块对应的物理块号
	int getsize(){size=Rand(15);return size;}  //随机产生文件大小
	void IN(int a,int b){Index.insert(a,b);}  //将物理块插入到文件的索引表
public:
	int firstblock;  //连续存储时,此文件对应的第一个物理块号
	int size;    //文件大小
	int flag;   //标志文件是否被分配好空间
    List Index;
};

//*******************************************
void FLX(FCB p, int x,int i,int init)
{  //连续存储的分配,x:随机产生的文件个数,i:物理块的个数,init:物理块的起始地址
    srand( (unsigned)time( NULL ) );
	for (int k=0;k<x;k++)
	{	
		cout<<"file"<<k+1;
		int l=rand()%15+1;
		if (l<=i)			 
		{  
		     p.flag=1;
			 p.firstblock=init;
			 init=init+l;
			 i=i-l;
			cout<<"        "<<l<<"             ";
			for(int j2=p.firstblock;j2<init;j2++)
			{
      			cout<<j2<<" ";
			}
			cout<<endl;
		 }
		 else  
		{      
			 p.flag=0;
		     p.firstblock=-1;
			cout<<"        "<<l<<"             "<<"存储空间不足!"<<endl;
		}		 
	}	  
}
			
int FCL(FCB p, int x,int value[][1],empty_block eq,empty_block fq,int k,int y)
{   //x:物理块数,value[][1]:标志物理块是否被分配,eq:空闲表,fq:文件所分配的物理块表k:文件长度,y:物理块数)
	if(k<=y)           //文件长度小于空闲块数
	{
		int m=0;
		cout<<"        "<<k<<"               ";
		for(int a=0;a<k;a++)   //k,文件长度
		{	
			while(m<=x)
			{
				m=Rand(x);    //随机给文件分配物理块
			    if(value[m][1]==0 )  //若此物理块未被分配
				{
			        eq.Del_list(m);   //此物理块从空闲表中删除
			        value[m][1]=1;  //置标志为1,表示此物理块被分配
			        fq.Insert(m);   //将此物理块加入到文件分配空间的表中
					//cout<<m<<" ";
					break;
				}
			}
		}
		fq.print();
		//cout<<endl;
		return 1;
	}
	else
	{
		cout<<"        "<<k<<"             "<<"存储空间不足!"<<endl;
		return 0;
	}
}
			
int FSY(FCB p, int x,int value[][1],empty_block q,int k,int y)
{   //x:物理块数,value[][1]:标志物理块是否被分配,Empty_list:空闲表,k:文件长度,y:物理块数)
	if(k<=y)           //文件长度小于空闲块数
	{
		int m=0;
		cout<<"        "<<k<<"               ";
		for(int a=0;a<k;a++)   //k,文件长度
		{	
			while(m<=x)
			{
				m=Rand(x);    //随机给文件分配物理块
			    if(value[m][1]==0 )  //若次物理块未被分配
				{
			        q.Del_list(m);   //此物理块从空闲表中删除
			        value[m][1]=1;  //置标志为1,表示此物理块被分配
			        p.IN(m,a);    //将此物理块插入到此文件的索引表
					break;
				}				   
			}
		}
		p.print1();
		cout<<endl;
		return 1;
	}
	else
	{
		cout<<"        "<<k<<"             "<<"存储空间不足!"<<endl;
		return 0;
	}
}


//**********************************
void main()
{
	cout<<"---------------模拟物理文件的存储过程------------------"<<endl<<endl;
	cout<<"           ----------------------------------"<<endl;
    cout<<"                      Y——开始运行"<<endl;
	cout<<"                      N——退出程序"<<endl;
	cout<<"            ---------------------------------"<<endl;
	printf("请输入提示符:(Y/N)"); 
	char c=getchar();
	cout<<endl;
	int i,temp,b,bi;
	int avail[100][1];    //物理块数组
	empty_block Empty_list;
	empty_block Full_list;
	FCB fcb;
	if(c=='y')
	{
			temp=Rand(10);  //文件个数
			cout<<"文件数:"<<temp;
			bi=b=i=Rand(100);   //产生的物理块数 
			cout<<"     存储空间大小为:"<<i<<endl;

       //--------模拟连续文件的存储过程-----------
			cout<<endl<<"--------模拟连续文件的存储过程-----------"<<endl;
			cout<<"文件名   文件大小(块)   占用存储空间"<<endl;
			for(int a1=0;a1<i;a1++)
			{
				avail[a1][1]=0;
			}
			int init=0;
			FLX(fcb, temp,i,init);
			
      //--------模拟串联文件的存储过程-----------
			cout<<endl<<"--------模拟串联文件的存储过程-----------"<<endl;
            cout<<"文件名   文件大小(块)   占用存储空间"<<endl;
			for(int a=0;a<i;a++)
			{
				avail[a][1]=0;
				Empty_list.Insert(a+1);
			}
			for(int j=0;j<temp;j++)
			{
				cout<<"file"<<j+1;
		        int l=fcb.getsize();
				if(FCL(fcb,i,avail,Empty_list,Full_list,l,b))
				   b=b-l;
			    //else 
				    //break;
			}

      //--------模拟索引文件的存储过程-----------
			cout<<endl<<"--------模拟索引文件的存储过程-----------"<<endl;
			cout<<"文件名   文件大小(块)   占用存储空间"<<endl;
			i=bi;b=bi;
			for(int a2=0;a2<i;a2++)
			{
				avail[a2][1]=0;
				Empty_list.Insert(a2+1);
			}
			for(int j1=0;j1<temp;j1++)
			{
				cout<<"file"<<j1+1;
		        int l=fcb.getsize();
				if(FSY(fcb,i,avail,Empty_list,l,b))
				   b=b-l;
			    //else 
				  // break;
			}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -