#include<iostream>
#include<stdlib.h>
#include<string>
#include<time.h>
using namespace std;
#define size 64
//*************************定义结构体******************
//定义连续文件结构体
struct lxfcb
{
int length;//文件长度
string name;//文件名
int head;//文件首地址
int kong;//1代表被占用,0代表未被占用
};
//定义串联文件结构体
struct clfcb
{
int length;//文件长度
string name;//文件名
int head;//文件首地址
int tail;// 文件尾地址
int kong;//1代表被占用,0代表未被占用
};
//定义索引文件结构体
struct indexfcb
{
string name;
int in[8];
int address;
int length;
int kong;//1代表被占用,0代表未被占用
};
//物理空间的结构体
struct block
{
int xinxi;//0表示未被占用,1表示已被占用
int next;//下一物理块的地址
};
//************************定义结构体*******************
int size1;
int count;
block a[size];//物理空间
lxfcb le[8];
clfcb c[8];
indexfcb ind[8];
void menu();//显示主菜单
void empty();//显示剩余空间
void display();//显示存储空间内的文件及存储地址
void creat();//创建新文件
void lianxu(string n,int l,int head);//创建连续文件
void chuanlian(string n,int l);//创建串联文件
void index(string n,int l);//创建索引文件
void init();//初始化
int checkname(string name,int type);//检查重名
int main()
{
srand(time(NULL));
size1=rand()%64;
count=size1;
init();
menu();
return 0;
}
void menu()
{
cout<<"****************模拟物理文件的存储过程***************"<<endl;
cout<<"***** 1.显示剩余存储空间 **********"<<endl;
cout<<"***** 2.显示存储空间内的文件及存储地址******"<<endl;
cout<<"***** 3.创建新文件 ******"<<endl;
cout<<"***** 4.退出 ******"<<endl;
cout<<"*****************************************************"<<endl;
int m;
while(1)
{
cin>>m;
if(m==1) empty();
else if(m==2) display();
else if(m==3) creat();
else if(m==4) exit(1);
else
{
cout<<"Error"<<endl;
return;
};
menu();
}
}
void init()
{
int i,j;
for(i=0;i<size1;i++)
a[i].xinxi =0;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
ind[i].in[j]=-1;
le[i].kong =0;
c[i].kong =0;
ind[i].kong=0;
}
}
void empty()//显示剩余空间
{
int j=0;
cout<<"剩余空间的大小是"<<count<<endl;
cout<<"剩余空间的地址是"<<endl;
for(int i=0;i<size1;i++)
if(a[i].xinxi==0)
{
j++;
cout<<i<<" ";
if(j%8==0)
cout<<endl;
}
cout<<endl;
}
int checkname(string name,int type)
{
int i;
if(type==1)
{
for(i=0;i<8;i++)
if(le[i].kong ==1)
if(!strcmp(le[i].name.c_str(),name.c_str()))
return 0;
return 1;
};
if(type==2)
{
for(i=0;i<8;i++)
if(le[i].kong ==1)
if(!strcmp(c[i].name.c_str(),name.c_str()))
return 0;
return 1;
};
if (type==3)
{
for(i=0;i<8;i++)
if(ind[i].kong ==1)
if(!strcmp(ind[i].name.c_str(),name.c_str()))
return 0;
return 1;
};
}
void display()//显示物理空间中所有的文件
{
int i,j,he;
cout<<"连续文件目录"<<endl;
cout<<"名称\t起始位置\t长度\t存储空间"<<endl;
for(i=0;i<8;i++)
if(le[i].kong ==1)
{
cout<<le[i].name <<" \t"<<le[i].head <<" \t"<<le[i].length;
cout<<" \t"<<le[i].head<<"---"<<le[i].head+le[i].length-1<<endl;
}
cout<<"串联文件目录"<<endl;
cout<<"名称\t起始位置\t结束位置\t长度\t存储空间"<<endl;
for(i=0;i<8;i++)
if(c[i].kong ==1)
{
he=c[i].head;
cout<<c[i].name <<" \t"<<c[i].head <<" \t"<<c[i].tail <<" \t"<<c[i].length<<" \t";
cout<<he<<"->";
for(j=1;j<c[i].length-1;j++)
{
cout<<a[he].next<<"->";
he=a[he].next;
}
cout<<c[i].tail<<endl;
}
cout<<"索引文件目录"<<endl;
cout<<"名称\t索引表位置\t长度"<<endl;
for(i=0;i<8;i++)
if(ind[i].kong ==1)
cout<<ind[i].name <<" \t"<<ind[i].address<<" \t"<<ind[i].length <<endl;
for(i=0;i<8;i++)
{
if(ind[i].kong ==1)
{
cout<<ind[i].name<<"文件的索引表为:"<<endl;
for(j=0;j<ind[i].length;j++)
cout<<j<<"--"<<ind[i].in[j]<<endl;
}
}
}
void creat()
{
cout<<"****************创建文件***************"<<endl;
cout<<"*** 1.连续文件 ***"<<endl;
cout<<"*** 2.串联文件 ***"<<endl;
cout<<"*** 3.索引文件 ***"<<endl;
cout<<"*** 4.返回上级菜单 ***"<<endl;
cout<<"***************************************"<<endl;
int cl,len,i,j,he,h,m;
string na;
int flag=0;
cout<<"请输入文件个数";
cin>>i;
for(j=1;j<i+1;j++)
{
cout<<"请输入第"<<j<<"个文件的类型";
cin>>cl;
cout<<"请输入第"<<j<<"个文件的名称";
//检测文件名是否已经存在
do{
cin>>na;
if(!checkname(na,cl))
{ cout<<"文件已经存在请重新输入第"<<j<<"个文件的名称";
flag = 1;
}
else
{
flag =0;
}
}while(flag);
cout<<"请输入第"<<j<<"个文件的大小";
cin>>len;
if(cl==1)
{
//判断是否有足够的空间可以创建连续文件
while(len>count)
{
cout<<"剩余空间不足"<<endl;
empty();
cout<<"请重新输入:";
cin>>len;
}
for(h=0;h<size1-len;h++)
{
he=0;
m=h;
while(he<size1&&a[m].xinxi==0)
{
he++;
m++;
}
if(he<len)
{
continue;
}
else break;
}
if(h==size1-len)
{
cout<<"无连续空间,不能创建"<<endl;
continue;
}
else lianxu(na,len,h);
}
else if(cl==2)
{
while(len>count)
{
cout<<"剩余空间不足"<<endl;
empty();
cout<<"请重新输入:";
cin>>len;
}
chuanlian(na,len);
}
else if(cl==3)
{
while(len+1>count||len>8)
{
cout<<"剩余空间不足或文件大小大于8"<<endl;
cout<<"请重新输入:";
cin>>len;
}
index(na,len);
}
else if(cl==4) menu();
else
{
cout<<"Error!"<<endl;
return;
}
}
}
void lianxu(string n,int l,int head)
{
int i,j;
for(i=0;i<8;i++)
if(le[i].kong==0) break;
le[i].name=n;
le[i].length=l;
le[i].head=head;
le[i].kong=1;
for(j=0;j<l;j++)
{
a[j+head].xinxi =1;
count--;
}
cout<<"创建成功"<<endl;
}
void chuanlian(string n,int l)
{
int i,j,h,ne;
for(i=0;i<8;i++)
if(c[i].kong==0) break;
c[i].name=n;
c[i].length=l;
count--;
c[i].kong =1;
c[i].head=rand()%size1;
c[i].tail=c[i].head;
h=c[i].head;
a[h].xinxi=1;
for(j=0;j<l-1;j++)
{
while(1)
{
ne=rand()%size1;
if(a[ne].xinxi==1)
{
continue;
}
break;
}
a[ne].xinxi=1;
a[c[i].tail].next=ne;
c[i].tail =ne;
count--;
}
cout<<"创建成功"<<endl;
}
void index(string n,int l)
{
int num,i,j,ne;
for(num=0;num<8;num++)
if(ind[num].kong==0) break;
ind[num].name=n;
ind[num].length=l;
ind[num].kong =1;
cout<<"请输入索引表存放的物理块:";
while(1)
{
cin>>ne;
if(a[ne].xinxi==1)
{
cout<<"该物理块已经被占用,请重新输入:";
continue;
}
if(ne>size1)
{
cout<<"索引表位置不存在,请重新输入:";
continue;
}
break;
}
ind[num].address=ne;
a[ne].xinxi =1;
count--;
for(j=0;j<l;j++)
{
while(1)
{
i=rand()%size1;
if(a[i].xinxi==1)
{
continue;
}
break;
}
a[i].xinxi=1;
ind[num].in[j]=i;
count--;
}
cout<<"创建成功"<<endl;
}
没有合适的资源?快使用搜索试试~ 我知道了~
模拟物理文件的存储过程
共15个文件
pdb:2个
opt:2个
ilk:1个
4星 · 超过85%的资源 需积分: 10 9 下载量 23 浏览量
2009-06-22
11:24:00
上传
评论
收藏 956KB RAR 举报
温馨提示
C++ os课程设计 连续文件、串联文件、索引文件 有报告 程序很简单
资源推荐
资源详情
资源评论
收起资源包目录
os.rar (15个子文件)
os
os.doc 165KB
xitong.plg 1KB
xitong.ncb 57KB
xitong.dsp 3KB
xitong.opt 48KB
Debug
vc60.pdb 108KB
xitong.ilk 786KB
vc60.idb 129KB
xitong.opt 43KB
xitong.pdb 1.07MB
xitong.obj 284KB
xitong.pch 1.97MB
xitong.exe 548KB
xitong.cpp 7KB
xitong.dsw 520B
共 15 条
- 1
资源评论
- 木沐晨2013-04-19操作系统的课设,挺全面的。
xbear0912
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功