📄 模拟文件系统.cpp
字号:
#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 + -