?? file.cpp
字號:
#include<iostream.h>
#include <math.h>
#include<iomanip.h>
#include<string.h>
#include<fstream.h>
int i=0,j=0,sum=0,tt=0,r,ii,k,g,m;
int a[100][32];
class file//文件類
{private:
int no; //文件編號
char name[10]; //文件名
public:
int tag; //刪除標記 1:已刪 0:未刪
file( ){ }
char *getname( ){return name;} //獲取姓名
int gettag( ){return tag;} //獲取刪除標記
int getno() {return no;} //獲取文件編號
int getlength() {return length;} //獲取文件大小
int getblocknum() {return blocknum;} // 磁盤塊數
int getblocksum1()//磁盤塊號的始點
{ return blocksum1; }
int getblocksum2()//磁盤塊號的終點
{ return blocksum2;}
int length; //文件大小
int blocknum;//盤塊數
int blocksum1;//所占盤塊號的始點
int blocksum2;//所占盤塊號的終點
void setname(char na[ ] ) //設置文件名
{strcpy(name,na);}
void delwenjian(){ tag=1; }//設置刪除標記 1:已刪 0:未刪
void creatfile(char *na,int L,int num,int s1,int s2) //創建文件
{ tag=0;
length=L;
blocknum=num;
blocksum1=s1;
blocksum2=s2;
strcpy(name,na);
blocknum=length/m; //盤塊數=文件大小/盤塊大小
if(length%m!=0) //盤塊數取上整
blocknum=blocknum+1;
cout<<" 所需磁盤塊數:"<<blocknum<<endl<<endl;
if((sum+blocknum)<=32) //所有盤塊數只占用一行,直接賦值
{ for(;j<(sum+blocknum);j++)
a[i][j]=1;
sum=sum+blocknum; //再進行下面文件的盤塊數累加
}
else
{ //占用多行,先賦值整行
for(;j<32;j++)
a[i][j]=1;
i=i+1;
for(j=0;j<(sum+blocknum)-32;j++) //再進行剩余項賦值
{
a[i][j]=1;
}
sum=sum+blocknum-32;
}
tt=tt+blocknum; //輸出文件所占用的盤塊號
cout<<" 所占磁盤塊號:"<<tt-blocknum<<" to "<<tt-1<<endl;
blocksum1=tt-blocknum;
blocksum2=tt-1;
}
void deltefile(char *na) //刪除文件
{ tag=1;
strcpy(name,na);
}
void disp( )//輸出文件信息
{
cout<<setw(8)<<name <<setw(10)<<length<<setw(18)<<blocknum<<setw(12)<<blocksum1<<" to "<<blocksum2<<endl;}
};
class fdatabase //文件庫類
{ private:
int top; //文件記錄指針
file f[50];
public:
fdatabase() //構造函數
{
top=-1;
}
int search(char *fname)//按文件名查找
{
for ( ii=0;ii<=top;ii++)
{ if (strcmp(f[ii].getname(),fname)==0 && f[ii].tag==0)
return 0;
}
return 1;
}
int creatfile(char *na,int L,int num,int s1,int s2)//創建文件時先查找是否存在
{ int p;
p=search(na);
if (p==1)
{ top++;
f[top].creatfile(na,L,num,s1,s2);
return 1;}
else
{cout<<" !!!該文件已存在,不能創建!!!\n\n";
return 0;
}
}
int deltefile(char *na)//刪除文件時先查找是否存在
{
int b,p,x=0,n1,n2,q1,q2,t;
p=search(na);
if (p==0) //若文件存在
{ //進行刪除文件賦值
f[ii].tag=1;
b=f[ii].length/m; //盤塊數=當前文件大小/盤塊大小
if(ii==0) // 對第一個刪除文件進行賦值
for(k=0;k<b;k++)
a[x][k]=0;
else{
n1=(f[ii-1].blocksum2+1)/32; //被查找的文件之前文件所占用的盤塊數/32,大于0表示跨行
n2=(f[ii].blocksum2+1)/32; //所有文件所占用的盤塊數/32,大于0表示跨行
q1=(f[ii-1].blocksum2+1)-n1*32; // 當前文件的開始盤塊號
q2=(f[ii].blocksum2+1)-n2*32; // 用于跨行后計算盤塊號
t=n2-n1;
if(t==0) //若n2與n1相等,表明當前所有被占用盤塊在同一行
for(k=q1;k<1+b;k++)
a[n2][k]=0;
else
{
if((f[ii-1].blocksum2+1)%32==0) //前面所占用的盤塊數是32倍數
{
x=x+n1; //當前文件賦值
for(;t-1>=0;t--,x++) //循環進行整行賦值
for(k=0;k<32;k++)
a[x][k]=0;
x=n2; //對剩余項賦值
for(k=0;k<b-(t-1)*32;k++)
a[x][k]=0;
}
else //對當前文件前幾項賦值
{ x=n1;
for(k=q1;k<32;k++)
a[x][k]=0;
x=x+1;
int t1=t;
for(;t-1>0;t--,x++) //中間整行賦值
for(k=0;k<32;k++)
a[x][k]=0;
x=n2; //最后剩余項賦值
for(k=0;k<(f[ii].blocksum2+1)-t1*32;k++)
a[x][k]=0;
}
}
return 1; }
}
else
{cout<<"該文件不存在";
return 0;}
}
void disp() //輸出所有文件信息
{
for (int i=0;i<=top;i++)
if(f[i].tag==0)
f[i].disp();
}
};
void bit_map(int I)
{
int s=0;
cout<<"----------------------------------------------------------------"<<endl;
for(int p=0;p<I;p++)
{for(int q=0;q<32;q++)
cout<<a[p][q]<<" ";
cout<<endl;
}
cout<<"----------------------------------------------------------------"<<endl;
for(int p1=0;p1<I;p1++)
for(int q1=0;q1<32;q1++)
if(a[p1][q1]==1)
s=s+1;
s=(g*1024)/m-s;
cout<<" 剩余盤塊數:"<<s<<endl;
}
void main()
{ int I,l,b,i,j,ss1,ss2,sum=0;
char fname[20];
fdatabase p;
file w;
cout <<"\t\t************************************************\n";
cout <<"\t\t* *\n";
cout <<"\t\t* 初始化,建立文件系統 *\n";
cout <<"\t\t* *\n";
cout <<"\t\t************************************************\n";
cout <<" 請輸入磁盤大小GB: ";
cin >>g;
cout<<endl;
cout <<" 請輸入盤塊大小MB: ";
cin >>m;
cout<<endl;
I=(g*1024)/(32*m);
for( i=0;i<I;i++)
for( j=0;j<32;j++)
a[i][j]=0;
cout<<" 建立的位示圖為:"<<endl;
bit_map(I);
cout<<" 行數:"<<I<<endl;
cout <<"\t\t************************************************\n";
cout <<"\t\t* *\n";
cout <<"\t\t* 行號、列號與磁盤塊號的轉換公式為: *\n";
cout <<"\t\t* 磁盤塊號=行號*32+列號 *\n";
cout <<"\t\t* 行號=磁盤塊號/32 *\n";
cout <<"\t\t* 列號=磁盤塊號%32 *\n";
cout <<"\t\t* *\n";
cout <<"\t\t************************************************\n";
char choice;
while(choice!='0')
{
cout <<"\t\t************************************************\n";
cout <<"\t\t* *\n";
cout <<"\t\t* 文 件 管 理 系 統 *\n";
cout <<"\t\t* *\n";
cout <<"\t\t************************************************\n";
cout <<"\t\t\t1 存 儲 文 件\n\n\t\t\t2 刪 除 文 件 \n\n\t\t\t3 顯示位示圖情況 \n\n\t\t\t4 顯示文件列表"<<endl;
cout <<" 請輸入選擇項: ";
cin >> choice;
cout<<endl;
switch (choice)
{
case '1':
cout <<" 請輸入文件名: ";
cin>>fname;
cout<<endl; //創建文件前,先查找是否有同名文件存在
int q;
q=p.search(fname);
if (q==0)
{
cout<<" !!!該文件已存在,不能創建!!!\n\n";
break;
}
cout <<" 請輸入文件大小MB: ";
cin>>l;
cout<<endl;
if(l>g*1024)
{cout<<" !!!文件大小超過磁盤最大容量,無法進行分配!!!"<<endl;
break;}
p.creatfile(fname,l,b,ss1,ss2);
break;
case '2':
cout <<" 請輸入文件名: ";
cin>>fname;
cout<<endl;
q=p.search(fname);
if (!q==0)
{
cout<<" !!!該文件不存在,無法刪除!!!\n\n ";
break;
}
p.deltefile(fname);
break;
case '3':
cout <<"\t\t**************顯示位示圖如下*********************\n";
bit_map(I);
cout<<endl;
break;
case '4':
cout <<"\t\t*************文件列表如下************************\n";
cout<<"----------------------------------------------------------------"<<endl;
cout<<setw(10)<<"文件名"<<setw(15)<<"文件大小(MB)"<<setw(15)<<"所占盤塊數"<<setw(15)<<"所占盤塊號"<<endl;
p.disp();
cout<<endl;
break;
default:
cout<<"輸入錯誤,請從新輸入: \n\n";
break;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -