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

📄 模拟文件系统.cpp

📁 文件系统(C++)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include"all_sj.h"
MFD mfdlist[16];
UFD ufdlist[16];
UOF uoflist[16];
DISK disklist[99];
char command[10],parameter1[14],parameter2[512];//用来存放命令和参数
MFD cur_mfd;//当前用户的mfd
char cur_user[14];//当前用户的用户名
/*初始化函数——
从disk.txt中读取mfd表的内容
*/
initial_mfd()
{
	ifstream input_file;//创建输入文件
	ofstream output_file;//创建输出文件
	
	char name[14];
	char pass[14];
	char ch1,ch2;
	int id,temp1,temp2;
	input_file.open("disk.txt",ios::binary|ios::ate);//以二进制“文件指针位于文件尾”的方式打开文件
	if(!input_file){
		cout<<"open file error!\n";
		return 1;
	}
	input_file.seekg(513,ios::beg);//mfdlist存放在1#盘块
	for(int k=0;k<16;k++)
	{
		for(int i=0;i<14;i++)
		{
			input_file.get(name[i]);
			if(name[i]==' ')
			{
				name[i]='\0';
				break;
			}
		}
		input_file.seekg(13-i,ios::cur);
		for(int j=0;j<14;j++)
		{
			input_file.get(pass[j]);
			if(pass[j]==' ')
			{
				pass[j]='\0';
				break;
			}
		}
		input_file.seekg(13-j,ios::cur);
		
		input_file.get(ch1);
		input_file.get(ch2);
		temp1=int(ch1)-48;//将字符转为int
		temp2=int(ch2)-48;
		if(ch2!=' ')
		{
		id=temp1*10+temp2;//十位数
		}
		else
		{
			id=temp1;//个位数
		}
		strcpy(mfdlist[k].username,name);
		strcpy(mfdlist[k].password,pass);
		mfdlist[k].ufd_id=id;
	
	}
	input_file.close();//关闭文件
return 0;
}
/*格式化硬盘-disk.txt
100个盘块,每个盘块大小是512字节数据+\n
并且第0#盘块存放disklist,初始化disklist每一项的flag=0
next=0,id<=0~99*/
void format(){
	ofstream output_file;//创建输出文件
	output_file.open("disk.txt",ios::binary|ios::ate);//以二进制“文件指针位于文件尾”的方式打开文件
	output_file.seekp(0,ios::beg);
	for(int j=0;j<100;j++)
	{
		for(int i=0;i<512;i++)
		{
			output_file<<' ';
		}
		output_file<<'\n';
	}
	output_file.seekp(0,ios::beg);
	for(int i=0;i<100;i++)
	{
		output_file<<i;
		if(i<10)
		{
			output_file<<' ';
		}
		output_file<<'0';
		output_file<<0;
		output_file<<' ';
	}
	output_file.close();
	for(int k=0;k<16;k++)
	{
		strcpy(mfdlist[k].username,"");
		strcpy(ufdlist[k].filename,"");
	}
	cout<<"成功格式化系统!\n";
}

/*找到一个空闲盘块,返回它的盘块号id*/
int getdisk()
{
	for(int i=34;i<100;i++)
	{
		if(disklist[i].flag=='0')
		{
		     disklist[i].flag='1';
			return disklist[i].id;
		}
	}
	return 0;
}

//从mfd中找user的条目
int findmfd(char user[]){
	int i=0;
	while(strcmp(mfdlist[i].username,"")!=0&&strcmp(mfdlist[i].username,user)!=0)//判断条件有误!!
	{
	i++;
	}
	return i;
}
	
/*
初始化ufd表,从硬盘中读入数据
*/
initial_ufd(char user[])
{
	ifstream input_file;
	input_file.open("disk.txt",ios::binary|ios::ate);
	if(!input_file){
		cout<<"open file error!\n";
		return 1;
	}
	int num=mfdlist[findmfd(user)].ufd_id;
	input_file.seekg(num*513,ios::beg);//从num#盘块读取
	char a;
    for(int i=0;i<16;i++)
	{
		input_file.seekg(num*513+22*i,ios::beg);
		input_file.get(a);
        input_file.seekg(num*513+22*i,ios::beg);
		if(a!=' ')
		{
			input_file>>ufdlist[i].filename;
            input_file.seekg(num*513+22*i+14,ios::beg);
			input_file>>ufdlist[i].mode;
			input_file.seekg(num*513+22*i+16,ios::beg);
			input_file>>ufdlist[i].length;
			input_file.seekg(num*513+22*i+20,ios::beg);
			input_file>>ufdlist[i].addr;
		}
		else
		{
			strcpy(ufdlist[i].filename ,"");
		}
	}


  

return 0;}


//初始化disklist表
initial_disk()
{	
	int id,next,temp1,temp2;
	char f,ch1,ch2;
    ifstream input_file;//创建输入文件
	input_file.open("disk.txt",ios::binary|ios::ate);//以二进制“文件指针位于文件尾”的方式打开文件
	if(!input_file){
		cout<<"open file error!\n";
		return 1;
	}
	input_file.seekg(0,ios::beg);
	for(int k=0;k<100;k++)
	{
		
		input_file.get(ch1);
		input_file.get(ch2);
		temp1=int(ch1)-48;//将字符转为int
		temp2=int(ch2)-48;
		if(ch2!=' '){
			id=temp1*10+temp2;
		}
		else{
			id=temp1;
		}
		input_file.get(f);
		
		input_file.get(ch1);
		input_file.get(ch2);
		temp1=int(ch1)-48;
		temp2=int(ch2)-48;
		if(ch2!=' '){
			next=temp1*10+temp2;
		}
		else{
			next=temp1;
		}
		
		disklist[k].flag=f;
		disklist[k].id=id;
		disklist[k].next=next;
	}
	input_file.close();
return 0;}

//把disklist表的内容存回到硬盘0#盘块,以便下一次从硬盘读取
back_disklist()
{
	ofstream output_file;
	output_file.open("disk.txt",ios::binary|ios::ate);
	if(!output_file){
		cout<<"open file error!\n";
		return 1;
	}
	output_file.seekp(0,ios::beg);
	for(int i=0;i<100;i++)
	{
		output_file<<disklist[i].id;
		if(disklist[i].id<10)
		{output_file.put(' ');
		}
		output_file<<disklist[i].flag;
		output_file<<disklist[i].next;
		if(disklist[i].next<10)
		{output_file.put(' ');
		}
	}
	output_file.seekp(512,ios::beg);
	output_file.put('\n');
	output_file.close();
return 0;
}

//把ufdlist的内容方到硬盘block#盘块
back_ufd()
{
	int block;
	ofstream output_file;
	block=mfdlist[findmfd(cur_user)].ufd_id;
	output_file.open("disk.txt",ios::binary|ios::ate);
	if(!output_file)
	{
		cout<<"open file disk.txt error!\n" ;
		return 0;
	}
	output_file.seekp(block*513,ios::beg);
	for(int i=0;i<16;i++)
	{
		output_file.seekp(block*513+22*i,ios::beg);
		for(int j=0;j<14;j++)
		{
			if(ufdlist[i].filename[j]!='\0')
			{
				output_file.put(ufdlist[i].filename[j]);
			}
			else
			{
				output_file.put(' ');
				if(j<13)
				{ufdlist[i].filename[j+1]='\0';}
			}
		}
		output_file<<ufdlist[i].mode;
		output_file.put(' ');
		output_file<<ufdlist[i].length;
		if(ufdlist[i].length<1000)
			output_file.put(' ');
		if(ufdlist[i].length<100)
			output_file.put(' ');
		if(ufdlist[i].length<10)
			output_file.put(' ');

		output_file<<ufdlist[i].addr;
		if(ufdlist[i].addr<10)
			output_file.put(' ');

	}
	output_file.close();
	
return 0;}

//把mfdlist内容存放到硬盘的1#盘块,以便下次读取
back_mfd()
{
	ofstream output_file;
	output_file.open("disk.txt",ios::binary|ios::ate);
	if(!output_file){
		cout<<"open file error!\n";
		return 1;
	}
	output_file.seekp(513,ios::beg);
	for(int i=0;i<16;i++)
	{
		for(int j=0;j<14;j++)
		{
			if(mfdlist[i].username[j]!='\0')
			{
				output_file.put(mfdlist[i].username[j]);
			}
			else
			{	
				if(j<13)
				{
				mfdlist[i].username[j+1]='\0';
				}
				output_file.put(' ');
			}

		}
		for( j=0;j<14;j++)
		{
			if(mfdlist[i].password[j]!='\0')
			{
				output_file.put(mfdlist[i].password[j]);}
			else
			{	
				if(j<13)
				{
				mfdlist[i].password[j+1]='\0';
				}
				output_file.put(' ');
			}

		}
		
		output_file<<mfdlist[i].ufd_id;
		if(mfdlist[i].ufd_id<10)
		{
			output_file.put(' ');
		}
	}
	output_file.close();
return 0;}

//登录

void login(char user[],char pass[])
{
	strcpy(cur_user,user);
	int m=0;
    if(strcmp(mfdlist[findmfd(user)].username,"")==0)
	{
		strcpy(mfdlist[findmfd(user)].username,user);
		strcpy(mfdlist[findmfd(user)].password,pass);
		for(int i=2;i<18;i++)
			if(disklist[i].flag=='0')break;
        disklist[i].flag='1';
        mfdlist[findmfd(user)].ufd_id=i;
		for(int j=0;j<16;j++)
			strcpy(ufdlist[j].filename,"");
	}
	else
	{
put_pass:
		if(strcmp(mfdlist[findmfd(user)].password,pass)!=0)
		{
			cout<<"密码错误\n";
			if(m<3)
			{
				cout<<"重新输入密码:";
				cin>>pass;
				cout<<'\n';
				m++;
				goto put_pass;
			}
			cout<<"你已经没有机会了!\n";
			exit(0);
		}

		initial_ufd(user);
		//初始化用户打开文件表;
			for(int k=0;k<16;k++)
			{
				strcpy(uoflist[k].filename,"");
			}
	}
}

//改变文件的读写属性
void chmod(char file[],int mod){
	int i=0,id=-1,id2;
	for(;i<16;i++)
	{
		if(strcmp(ufdlist[i].filename,file)==0)
		{
			id=i;
		}
	}
	if(id==-1){
	cout<<"改文件不存在!不能更改读写属性!\n";
	return;
	}
	for(i=0;i<16;i++)
	{
		if(strcmp(uoflist[i].filename,file)==0)
		{
			id2=i;
		}
	}
	if(mod==0||mod==1||mod==2)
	{
	ufdlist[id].mode=mod;
	uoflist[id2].mode=mod;
	cout<<"修改读写属性成功!\n";
		back_disklist();
	back_mfd();
	back_ufd();
	return;
	}
	else
	{
		cout<<"修改的读写模式不合法,不能修改!\n";
		return;
	}


}

//关闭文件
void close(char filename[]){
	int i=0,id=-1;
	ofstream output_file;
	for(;i<16;i++)
	{
		if(strcmp(uoflist[i].filename,filename)==0)
		{
			id=i;
		}
	}
	if(id!=-1){
	if(uoflist[id].state==0)//状态为建立
	{
    //此处设置文件结束标志
		output_file.open("disk.txt",ios::binary|ios::ate);
		if(!output_file)
		{
			cout<<"open disk.txt error!\nCannot close the file!\n";
			return;
		}
		output_file.seekp(uoflist[id].addr*513+uoflist[id].writeptr,ios::beg);
		output_file<<'\0';
		
	}
	if(uoflist[id].state==0||uoflist[id].state==1)
	{
		strcpy(uoflist[id].filename,"");
		cout<<"文件关闭成功!\n";
		return;
	}
	else{
		cout<<"该文件已经关闭!\n";
		return;
	}
	}
	else//UOF表中没有该文件
	{
		cout<<"没有该文件!\n";
		return;
	}
}

//创建文件
void create(char filename[],int mod)
{
	int i=0,id1=-1,j=0,id2=-1;
	//判断文件属性是否正确
	if(mod<0||mod>2)
	{
		cout<<"文件属性不合法,请输入0-2的数字!\n";
		return;
	}
	//在ufdlist中查找
	for(;i<16;i++){
		if(strcmp(ufdlist[i].filename,filename)==0)
		{
			id1=i;
		}
	}
	if(id1!=-1){//在ufdlist找到
		cout<<"该文件已经存在,不能建立重名文件!\n";
		return;
	}
	else
	{//在ufdlist中找到空条目
		id1=-1;
		for(i=0;i<16;i++){
			if(strcmp(ufdlist[i].filename,"")==0)
			{
				id1=i;
				break;
			}
		}
		if(id1==-1)//ufdlist中没有空闲
		{
			cout<<"ufdlist中没有空闲!\n";
			return;
		}
		else
		{
			
			//在uoflist中找到空条目
			for(;j<16;j++)
			{
				if(strcmp(uoflist[j].filename,"")==0)
				{
					id2=j;
					break;
				}
			}
			if(id2==-1)//uoflist中没有空闲
			{
				cout<<"uoflist中没有空闲!\n";
				return;
			}
			else
			{
				if(mod!=0&&mod!=1&&mod!=2)
				{
					cout<<"文件读写属性错误,不能创建文件!\n";
					return;
				}
				//填写ufd相关信息
				strcpy(ufdlist[id1].filename,filename);
				ufdlist[id1].mode=mod;
				ufdlist[id1].length=0;
				ufdlist[id1].addr=getdisk();
				disklist[ufdlist[id1].addr].flag='1';

				//置文件结束标志;
                ofstream output_file;
				output_file.open("disk.txt",ios::binary|ios::ate);
				output_file.seekp(ufdlist[id1].addr*513,ios::beg);
				output_file.put('\0');
				output_file.close();

				//填写uof相关信息
				strcpy(uoflist[id2].filename,filename);
				uoflist[id2].length=0;
				uoflist[id2].addr=ufdlist[id1].addr;
				uoflist[id2].mode=mod;
				uoflist[id2].state=0;
				uoflist[id2].readptr=uoflist[id2].writeptr=0;//不知读写指针赋值是否正确
				cout<<"创建文件"<<filename<<"成功!\n";
					back_disklist();
	back_mfd();
	back_ufd();
			}
		}
	}
	
}

⌨️ 快捷键说明

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