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

📄 main.cpp

📁 操作系统课程设计 模拟unix文件系统 心血
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
//模拟2Mb


const char FileName[]="os.txt";
const char NullName[]="0000000000000";
const int DirLen=1; 
const short SSNum=-1;	//super block num


enum FileSpec{NORMAL,DIR,BLOCK,PIP};//0,1,2,3
//i节点结构信息
struct INode{
	FileSpec fileSpec;
	short iaddr[13];
	int fileLength;
	int linkCount;

};

struct DirChild
{
  char filename[14];
  short i_BNum ;
};
struct DirNode{
DirChild childItem[64];
short	DirCount;
};
short SS[51];				//超级栈,指针为SS[0]
short freeBlockNum=0;		//当前可用盘快所在组记录的盘快号
short freeTotalB=20450;

short freeDirNode[29];		//可用索引节点栈
short freeDirCount=30;		//索引节点栈指针

short currDirNum;		//当前目录所在的磁盘号
short currINum;

DirNode *currDir;
INode	*iNode;

 //================================================================
//函数描述:创建20M磁盘
//入口参数:无
//返回值: 无
//===============================================================
void Format()
{

	cout<<"系统正在初始化......"<<endl;
	// 打开文件
	FILE *f = fopen(FileName,"w+");
	if (f == NULL)
	{
	cout<<"程序创建错误,请重新输入"<<endl;
	return ;
	}

	for(int i=0;i<20971520;i++)//20971520=20Mb,暂时2mb
	 fprintf(f,"%c",'0');
	

	// 关闭文件
	fclose(f);

}


//================================================================
//函数描述:数组赋值
//入口参数:无
//返回值: 无
//===============================================================

void ArrarEqual(short arr[51],short begin,short end)
{
	for(short i=0;i<end-begin+1;i++)
		arr[50-i]=begin+i;
}

//================================================================
//函数描述:数组赋值
//入口参数:无
//返回值: 无
//===============================================================
/*
void BWrite(short arr[51],short diskNum){
	FILE *f = fopen(FileName, "r+");
	if (f == NULL)
	{
	cout<<"写文件处错误,请重新输入"<<endl;
	return ;
	}
	//设置文件指针
	if(fseek(f,1024*diskNum,0))
		cout<<"文件指针错误"<<endl;
	fwrite(arr,sizeof(short),51,f);
	fclose(f);
	
	
}
*/
//================================================================
//函数描述:重构BWrite,实现一个数组的写入
//入口参数:无
//返回值: 无
//===============================================================
void BWrite(short arr[51],short diskNum ){
	FILE *f = fopen(FileName, "r+");
	if (f == NULL)
	{
	cout<<"写文件处错误,请重新输入"<<endl;
	return ;
	}
	//设置文件指针
	if(fseek(f,1024*diskNum,0))
		cout<<"文件指针错误"<<endl;
	fwrite(arr,sizeof(short),51,f);
	fclose(f);
	
}

//================================================================
//函数描述:重构BWrite,实现一个数组的写入,数组长度不确定
//入口参数:无
//返回值: 无
//===============================================================
void BWriteArr(short arr[512],short diskNum ){
	FILE *f = fopen(FileName, "r+");
	if (f == NULL)
	{
	cout<<"写文件处错误,请重新输入"<<endl;
	return ;
	}
	//设置文件指针
	if(fseek(f,1024*diskNum,0))
		cout<<"文件指针错误"<<endl;
	fwrite(arr,sizeof(short),512,f);
	fclose(f);
	
}
//================================================================
//函数描述:重构BWrite,实现一个数组的写入
//入口参数:无
//返回值: 无
//===============================================================
void MyBWrite(short arr[51],short diskNum ){
	FILE *f = fopen(FileName, "r+");
	if (f == NULL)
	{
	cout<<"写文件处错误,请重新输入"<<endl;
	return ;
	}
	//设置文件指针
	if(fseek(f,1024*diskNum,0))
		cout<<"文件指针错误"<<endl;
	for(short i=0;i<51;i++)
	fprintf(f,"%d",arr[i]);
	fclose(f);
	
}
//================================================================
//函数描述:从磁盘中读出数组
//入口参数:无
//返回值: 无
//===============================================================
void MyBRead(short arr[51],short diskNum){
	FILE *f = fopen(FileName, "r+");
	if (f == NULL)
	{
	cout<<"读文件处错误,请重新输入"<<endl;
	return ;
	}
	//设置文件指针
	if(fseek(f,1024*diskNum,0))
		cout<<"文件指针错误"<<endl;
	for(short i=0;i<51;i++)
		fscanf(f,"%d",&arr[i]);
	fclose(f);
	
}
//================================================================
//函数描述:从磁盘中读出iNode节点
//入口参数:无
//返回值: 无
//===============================================================
void BRead(INode *iNode,short diskNum){
	FILE *f = fopen(FileName, "r+");
	if (f == NULL)
	{
	cout<<"写文件处错误,请重新输入"<<endl;
	return ;
	}
	//设置文件指针
	if(fseek(f,1024*diskNum,0))
		cout<<"文件指针错误"<<endl;
	fscanf(f,"%d",&iNode->fileLength);
	int temp=int(fgetc(f));
	switch(temp){
	case 0:
		iNode->fileSpec=NORMAL;
		break;
	case 1:
		iNode->fileSpec=DIR;
		break;
	case 2:
		iNode->fileSpec=BLOCK;
		break;
	case 3:
		iNode->fileSpec=PIP;
		break;
	}

	fread(iNode->iaddr,2,13,f);
	fscanf(f,"%d",&iNode->linkCount);
	fclose(f);
	
}
//================================================================
//函数描述:从磁盘中读出数组
//入口参数:无
//返回值: 无
//===============================================================
void BRead(short arr[51],short diskNum){
	FILE *f = fopen(FileName, "r+");
	if (f == NULL)
	{
	cout<<"读文件处错误,请重新输入"<<endl;
	return ;
	}
	//设置文件指针
	if(fseek(f,1024*diskNum,0))
		cout<<"文件指针错误"<<endl;
	fread(arr,sizeof(short),51,f);
	fclose(f);
	
}
//================================================================
//函数描述:从磁盘中读出数组, 放入到iNOde中
//入口参数:无
//返回值: 无
//===============================================================
void BReadArr(short arr[512],short diskNum){
	FILE *f = fopen(FileName, "r+");
	if (f == NULL)
	{
	cout<<"读文件处错误,请重新输入"<<endl;
	return ;
	}
	//设置文件指针
	if(fseek(f,1024*diskNum,0))
		cout<<"文件指针错误"<<endl;
	fread(arr,sizeof(short),512,f);
	fclose(f);
	
}
//================================================================
//函数描述:写入一个目录项
//入口参数:无
//返回值: 无
//===============================================================
void BWrite(DirNode *currDir,short diskNum){
	FILE *f = fopen(FileName, "r+");
	if (f == NULL)
	{
	cout<<"写文件处错误,请重新输入"<<endl;
	return ;
	}
	//设置文件指针
	if(fseek(f,long(1024*diskNum),0))
		cout<<"文件指针错误"<<endl;
	for(int i=0;i<64;i++)
	{
		fprintf(f,"%hd",currDir->childItem[i].i_BNum);
		fputs(currDir->childItem[i].filename,f);

	}
	fclose(f);
	
}
//================================================================
//函数描述:写入一个iNode
//入口参数:无
//返回值: 无
//===============================================================
void BWrite(INode *iNode,short diskNum){
	FILE *f = fopen(FileName, "r+");
	if (f == NULL)
	{
	cout<<"写文件处错误,请重新输入"<<endl;
	return ;
	}
	//设置文件指针
	if(fseek(f,1024*diskNum,0))
		cout<<"文件指针错误"<<endl;
	fprintf(f,"%d",iNode->fileLength);
	fputc(iNode->fileSpec,f);
	fwrite(iNode->iaddr,2,13,f);
	fprintf(f,"%d",iNode->linkCount);
	fclose(f);
	
}


//================================================================
//函数描述:分配一个空闲的普通快
//入口参数:无
//返回值: 无
//===============================================================
short AssAnEmpty(){
	short temp;
	if(SS[0]>1){	
			SS[0]--;
			temp=SS[SS[0]+1];
//			SS[SS[0]+1]=-1;
			freeTotalB--;//总剩余数-1
			return temp;
	}else{
		if(SS[1]==0){
			cout<<"盘片用尽"<<endl;
			return -1;
		}	
		temp=freeBlockNum;
		freeBlockNum=SS[1];
		BRead(SS,SS[1]);
		if(temp==0){
			SS[0]--;
			temp=SS[SS[0]+1];
//			SS[SS[0]+1]=-1;
		}
		freeTotalB--;
		return temp;
		
	}
	

}
//================================================================
//函数描述:分配一个空闲的目录快
//入口参数:无
//返回值: 无
//===============================================================
short AssAnDir(){
	if(freeDirCount==0){
		cout<<"无空余目录节点"<<endl;
		return -1;
	}
	else{
		freeDirCount--;
		short s=freeDirNode[freeDirCount];
		freeDirNode[freeDirCount]=-1;
		return s;	//可用索引节点栈
		}
		
}

//================================================================
//函数描述:创建一个文件节点,并分配INOde和磁盘空间
//入口参数:无
//返回值: 无
//===============================================================
void InitCreate(DirNode *currDir,FileSpec fielSpec,char filename[14],INode *iNode,short diskNum){

	//	int blockNum=AssertAnEmpty();
	if(fielSpec==DIR){
		//init dirNode and write
	  int blockNum=AssAnDir();
	  currDirNum=blockNum;
	  for(int i=0;i<64;i++){
		  strcpy(currDir->childItem[i].filename,"0000000000000");
		  currDir->childItem[i].i_BNum=-1;
	  }
	
	  BWrite(currDir,blockNum);


/*
		//init INode and write
	  blockNum=AssertAnEmpty();	
	  iNode->fileLength=DirLen;
	  iNode->fileSpec=DIR;
	  iNode->iaddr[0]=blockNum;
	  iNode->linkCount=1;
	  BWrite(iNode,distNum);
	  //为文件分配磁盘空间
*/
	}//end  if(fileSpec==DIR)

	
}
//================================================================
//函数描述:初始化
//入口参数:无
//返回值: 无
//===============================================================
void Init(DirNode *currDir,FileSpec fielSpec,char filename[14],INode *iNode,short diskNum){	

	InitCreate(currDir,fielSpec,filename,iNode,diskNum);
	BRead(SS,0);




}
//================================================================
//函数描述:初始化索引栈
//入口参数:无
//返回值: 无
//===============================================================
void Init(){
for(int i=0;i<30;i++)
freeDirNode[i]=30-i;	//可用索引节点栈
freeDirCount=30;		//索引节点栈指针
	
	}



//================================================================
//函数描述:成组链接初始化
//入口参数:无
//返回值: 无
//===============================================================
void Linkdisk(){
	//临时空闲栈
	SS[0]=50;
	ArrarEqual(SS,31,80);
 	BWrite(SS,0);

	for(short i=1;i<408;i++){
		SS[0]=50;
		ArrarEqual(SS,i*50+31,i*50+80);
		BWrite(SS,i*50+30);
		BRead(SS,0);
		
	}
	ArrarEqual(SS,408*50+31,408*50+79);
	SS[1]=0;//49
	BWrite(SS,408*50+30);

	cout<<"磁盘disk.txt完成创建,大小20MB"<<endl;


		
}

//================================================================
//函数描述:判断一个文件是否存在
//入口参数:无
//返回值: -1,不存在,文件号
//===============================================================
short IsFileExist(DirNode *currDir,char fileName[14]){
	for(int i=0;i<64;i++){
		if(strcmp(fileName,currDir->childItem[i].filename)==0)
			return currDir->childItem[i].i_BNum;
	}
	return -1;
}
//================================================================
//函数描述:判断一个文件是一个普通文件
//入口参数:无
//返回值: -1,不存在,文件号
//===============================================================
bool IsFile(INode *iNode,short diskNum){
	BRead(iNode,diskNum);
	if(iNode->fileSpec==NORMAL)
	return true;
	else
	return false;
}
//================================================================
//函数描述:判断一个文件是一个普通文件
//入口参数:无
//返回值: -1,不存在,文件号
//===============================================================
bool IsDir(INode *iNode,short diskNum){
	BRead(iNode,diskNum);
	if(iNode->fileSpec==DIR)
	return true;
	else
	return false;
}
	
	
//================================================================
//函数描述:创建一个iNode,并分配磁盘空间
//入口参数:无
//返回值: 无  AssAnEmpty(),BWrite(dirChild,dir[512-i])未实现
//===============================================================
void CreateINode(INode *iNode,FileSpec fileSpec,short linkCount,short length){
			iNode->fileSpec=fileSpec;
			iNode->linkCount=linkCount;
			iNode->fileLength=length;

			//为目录磁盘,分配目录节点
			if(fileSpec==DIR){
				iNode->iaddr[0]=AssAnDir();
				return;
			}
			//根据文件长度分配文件磁盘节点
			//直接寻址
			short i;
			i=10;
			short left=length;
			while(left&&i){
				iNode->iaddr[10-i]=AssAnEmpty();
				left--;
				i--;		
			}
			if(left>0){	//一级索引
				i=512;
				short dir[512];
				iNode->iaddr[10]=AssAnEmpty();
				while(left&&i){
					dir[512-i]=AssAnEmpty();
					i--;
					left--;
				}
				if(i!=0)
				dir[512-i+1]=-1;//标志文件结束

⌨️ 快捷键说明

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