📄 main.cpp
字号:
#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 + -