#include <iostream>
using namespace std;
struct Page//文件目录
{
string name;//文件名
int num;//起始块号
int length;//文件长度
Page *pre;
Page *next;
};
struct Node//物理块
{
int num;//为0时为空
string str;//逻辑记录
};
int frees=32;//空闲物理块号
Node node[32];
void init(Page *head)//初始化
{
for(int i=0;i<32;i++)
{
node[i].num=0;
node[i].str="";
}
head->name=" ";
head->num=-1;
head->length=0;
head->pre=NULL;
head->next=NULL;
}
void create(Page *head)//新建文件
{
cout<<"请输入文件名\n";
string str;
cin>>str;
Page *temp=new Page();
Page *temp1=new Page();
temp->name=str;
for(temp1=head;temp1!=NULL;temp1=temp1->next) //文件名已存在
{
if(str==temp1->name)
{
cout<<"文件名已存在,请重新输入\n";
delete temp;
delete temp1;
return ;
}
}
cout<<"请输入文件长度\n";
int leng;
cin>>leng;
if(leng>frees) //判断是否有足够的空闲块
{
cout<<"磁盘空间不足\n";
delete temp;
return ;
}
frees-=leng;
cout<<"请输入文件内容\n";
string str1[leng];
for(int i=0;i<leng;i++)//输入文件内容
{
cin>>str1[i];
}
int cou=0;
for(int i=0;i<leng;i++)
{
for(int j=0;j<32;j++)
{
if(node[j].num==0)//查找空闲块
{
if(i==0) //起始块号
{
cou=j;
temp->num=j;
temp->length=leng;
temp->next = head->next; //头插法插入新作业
if(head->next != NULL)
head->next->pre = temp;
temp->pre = head;
head->next = temp;
node[j].str=str1[i];
node[cou].num=-1;
}
else if(i==leng-1)//末尾
{
node[j].str=str1[i];
node[cou].num=j;
node[j].num=-1;
}
else//中间
{
node[j].str=str1[i];
node[cou].num=j;
node[j].num=-1;
cou=j;
}
break;
}
}
}
cout<<"新建成功\n";
}
void change(Page *head)//插入内容,设定每次只能插入一段内容
{
if(frees==0) {cout<<"无空闲块\n";return ;}
cout<<"请输入要修改的文件名\n";
string str;
cin>>str;
Page *temp=new Page();
for(temp=head;temp!=NULL;temp=temp->next)
{
if(temp->name==str)
{
temp->length++;
cout<<"在第几段文件插入\n";
int nu;
cin>>nu;
cout<<"请输入文件内容\n";
string str1;
cin>>str1;
int temp1=temp->num;
string temp2=str1;
int i=1;
string nk;
while(1)//插入位置之后的内容后移
{
if(i==temp->length-1)
{
for(int k=0;k<32;k++)
{
if(node[k].num==0)
{
string nk2=temp2;
temp2=node[temp1].str;
node[temp1].num=k;
node[temp1].str=nk2;
temp1=k;
break;
}
}
node[temp1].str=temp2;
node[temp1].num=-1;
break;
}
nk=temp2;
temp2=node[temp1].str;
if(i>nu) node[temp1].str=nk;
if(i==nu) node[temp1].str=str1;
temp1=node[temp1].num;
i++;
}
cout<<"插入成功\n";
frees--;//空闲块减一
return;
}
}
cout<<"文件名不存在"<<endl;
}
void shanchu(Page *head)//删除
{
cout<<"请输入要删除的文件名\n";
string str;
cin>>str;
Page *temp=new Page();
for(temp=head;temp!=NULL;temp=temp->next)
{
if(temp->name==str)
{
int i=temp->num;
while(1)
{
frees++;//每次空闲块加1
node[i].str="";
if(node[i].num==-1)
{
node[i].num=0;
break;
}
int temp1=node[i].num;
node[i].num=0;
i=temp1;
}
temp->pre->next=temp->next;//删除输入的文件
if(temp->next!=NULL) temp->next->pre=temp->pre;
cout<<"删除成功\n";
delete temp;
return ;
}
}
cout<<"文件不存在\n";
}
void print1(Page *head)//打印文件目录
{
cout<<"文件目录如下:\n";
cout<<"文件名 文件长度\n";
Page *temp=new Page();
for(temp=head->next;temp!=NULL;temp=temp->next)
{
cout<<temp->name<<" "<<temp->length<<"\n";
}
delete temp;
}
void print2()//打印文件定位表
{
cout<<"块号 指向 内容"<<endl;
for(int i=0;i<32;i++)
{
cout<<i<<" "<<node[i].num<<" "<<node[i].str<<endl;
}
}
int main()
{
Page *head=new Page();
init(head);
while(1)
{
int choice;
cout<<".....................................\n";
cout<<"1、新建文件\n2、修改文件\n3、删除文件\n4、查看文件目录\n5、查看文件定位表(FAT)\n";
cout<<".....................................\n";
cin>>choice;
switch(choice)
{
case 1:
create(head);
break;
case 2:
change(head);
break;
case 3:
shanchu(head);
break;
case 4:
print1(head);
break;
case 5:
print2();
break;
default:
cout<<"没有此操作,请重新输入\n";
}
}
}
1.文件创建写入
2.文件修改
3.删除文件
4.查看文件目录
5.查看文件定位表