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

📄 file.cpp

📁 操作系统的设计性实验~文件系统 &#8226 熟悉文件系统管理过程 &#8226 模拟文件系统工作过程
💻 CPP
字号:
#include<iostream.h>
#include <math.h>
#include<iomanip.h>
#include<string.h>
#include<fstream.h>
int i=0,j=0,sum=0,tt=0,r,ii,k,g,m;
int a[100][32];
class  file//文件类
{private:

	int no;   //文件编号
	char name[10];  //文件名

 public:
    
    int tag;  //删除标记 1:已删 0:未删

file( ){ }
    char *getname( ){return name;} //获取姓名
	int gettag( ){return tag;} //获取删除标记
	int getno() {return no;}           //获取文件编号
	 int getlength() {return length;}           //获取文件大小
	 int getblocknum() {return blocknum;} // 磁盘块数
  int getblocksum1()//磁盘块号的始点
  {	  return blocksum1;  } 

 int getblocksum2()//磁盘块号的终点
  {	  return blocksum2;} 


 	int length; //文件大小
	int blocknum;//盘块数
	int blocksum1;//所占盘块号的始点
	int blocksum2;//所占盘块号的终点

	void setname(char na[ ] ) //设置文件名
	{strcpy(name,na);}

void delwenjian(){  tag=1;  }//设置删除标记 1:已删 0:未删

void creatfile(char *na,int L,int num,int s1,int s2) //创建文件
  {  tag=0;  
     length=L;
     blocknum=num;
     blocksum1=s1;
	 blocksum2=s2;
    strcpy(name,na);
    blocknum=length/m;       //盘块数=文件大小/盘块大小

 if(length%m!=0)             //盘块数取上整
   blocknum=blocknum+1;       
    cout<<"  所需磁盘块数:"<<blocknum<<endl<<endl;
 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<<"  所占磁盘块号:"<<tt-blocknum<<"  to  "<<tt-1<<endl;
     blocksum1=tt-blocknum;
	 blocksum2=tt-1;

}
void deltefile(char *na) //删除文件
  {  tag=1;
    
   strcpy(name,na);
}
void disp( )//输出文件信息
 {

  cout<<setw(8)<<name <<setw(10)<<length<<setw(18)<<blocknum<<setw(12)<<blocksum1<<"  to  "<<blocksum2<<endl;}
};
class fdatabase  //文件库类
{ private:  
int top; //文件记录指针
file f[50];
public:

fdatabase()   //构造函数
	

{
top=-1;

} 
	
   
	int search(char *fname)//按文件名查找
	{
		for ( ii=0;ii<=top;ii++)
		{	if (strcmp(f[ii].getname(),fname)==0 && f[ii].tag==0)
			    
				return 0;
		}	
		
				return 1;
	       
	}
		int creatfile(char *na,int L,int num,int s1,int s2)//创建文件时先查找是否存在
	{   int p;
	    	p=search(na);
		if (p==1)
		{  top++;
		  	f[top].creatfile(na,L,num,s1,s2);
			
		  return 1;}
		else
		{cout<<"  !!!该文件已存在,不能创建!!!\n\n";

		return 0;
		 
		}
	
		
	}



		int deltefile(char *na)//删除文件时先查找是否存在
		{
			int b,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<b;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<b-(t-1)*32;k++)
					 a[x][k]=0;
			  }
			  else                            //对当前文件前几项赋值
			  {    x=n1;
				  for(k=q1;k<32;k++)
				    a[x][k]=0;
                  x=x+1;
                  int t1=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;

			  }
			 
		 }

		 return 1;  }
				
	}
      else
		{cout<<"该文件不存在";
		return 0;}


	  
 
		}


	void disp()  //输出所有文件信息
	{
           for (int i=0;i<=top;i++)
			  if(f[i].tag==0)
			   f[i].disp();
	}
	

};





void bit_map(int I)
{ 
int s=0;
cout<<"----------------------------------------------------------------"<<endl;
   for(int p=0;p<I;p++)
   {for(int q=0;q<32;q++)
		   cout<<a[p][q]<<" ";
          	cout<<endl;
			 
   }
   cout<<"----------------------------------------------------------------"<<endl;
    for(int p1=0;p1<I;p1++)
     for(int q1=0;q1<32;q1++)
	 if(a[p1][q1]==1)
					  s=s+1;
					 s=(g*1024)/m-s; 
	 cout<<"   剩余盘块数:"<<s<<endl;  
		
   				
}



void main()
{  int I,l,b,i,j,ss1,ss2,sum=0;
       

    char fname[20];
     fdatabase p;
	 file  w;
     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<<endl;
	 cout <<"  请输入盘块大小MB:  ";
   	 cin >>m;
	 cout<<endl;
	 I=(g*1024)/(32*m);
      for( i=0;i<I;i++)
	    for( j=0;j<32;j++)
		        a[i][j]=0;	
	        	cout<<"  建立的位示图为:"<<endl;
               bit_map(I);
		
			   cout<<"   行数:"<<I<<endl;
			    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";
	char choice;
	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   显示文件列表"<<endl; 
			cout <<"  请输入选择项:    ";
			cin >> choice;
			 cout<<endl;
			switch (choice)
			{
			case '1':
				
		           cout <<"  请输入文件名:    ";
					 cin>>fname;
					  cout<<endl;      //创建文件前,先查找是否有同名文件存在
					  int q;
	                 	q=p.search(fname);
		               if (q==0)
					   {   
						   cout<<"  !!!该文件已存在,不能创建!!!\n\n";       
						   break;
	                    }		
                     cout <<"  请输入文件大小MB:   ";
					 cin>>l;
					  cout<<endl; 
					 if(l>g*1024)
					 {cout<<"  !!!文件大小超过磁盘最大容量,无法进行分配!!!"<<endl;
					 break;}              
				   p.creatfile(fname,l,b,ss1,ss2);               
		           break;
			case '2':
				cout <<"  请输入文件名:    ";
					 cin>>fname;
					  cout<<endl;
					   
	             	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<<endl;
		
					break;
		case '4':
			  
			  
			  cout <<"\t\t*************文件列表如下************************\n";
			  
			  cout<<"----------------------------------------------------------------"<<endl;
			cout<<setw(10)<<"文件名"<<setw(15)<<"文件大小(MB)"<<setw(15)<<"所占盘块数"<<setw(15)<<"所占盘块号"<<endl;
			p.disp();
			cout<<endl;

			 

			break;
     	default:
			cout<<"输入错误,请从新输入:   \n\n";
		break;
			

			}
	}
}

⌨️ 快捷键说明

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