📄 base.cpp
字号:
#include"base.h"
#include<math.h>
#include <conio.h>
#include <cstdlib>
//*********************************************************************
string dirfile="dir.txt";
string supbkfile="supbk.txt";
string inodefile="inode.txt";
string usrfile="usr.txt";
string unixdisk="unix.txt";
//*********************************************************************
string inttochar(int num)
{
string s;
if(num<10)
{
s='0';
s+=(char)(num+48);
return s;
}
else if(num<100&&num>=10)
{
s=(char)(num/10+48);
s+=(char)(num%10+48);
return s;
}
else if(num<1000&&num>=100)
{
s=(char)(num/100+48);
s+=(char)(num%100/10+48);
s+=(char)(num%100%10+48);
return s;
}
return s;
}
int stringtoint(string s)
{
int temp=0;
int i;
int t=s.length();
int k=t;
for(i=0;i<t;i++)
{
temp=temp+(((int)s[i])-48)*pow(10,k-1);
k--;
}
return temp;
}
////////////////////////////////////////////////////////////////
void writeusr(usr u)
{
ofstream out;
out.open(usrfile.c_str(),ios::app);
out<<u.usrname<<" "<<u.password<<" "<<u.uid<<u.gid<<endl;
out.close();
}
void writeinode(inode ind)
{
ofstream out;
out.open(inodefile.c_str(),ios::app);
out<<ind.i_num<<" "<<ind.uid<<" "<<ind.gid<<" "<<ind.size<<" "<<ind.links<<" "<<ind.mode<<" "<<ind.ctime<<" "<<ind.lctime
<<" "<<ind.di_addr[0]<<" "<<ind.di_addr[1]<<" "<<ind.di_addr[2]<<" "<<ind.di_addr[3]<<" "<<ind.di_addr[4]<<" "<<ind.di_addr[5]
<<" "<<ind.di_addr[6]<<" "<<ind.di_addr[7]<<" "<<ind.di_addr[8]<<" "<<ind.di_addr[9]<<endl;
out.close();
}
void writedir(dir di)
{
ofstream out;
out.open(dirfile.c_str(),ios::app);
out<<di.fatherid<<" "<<di.dirname<<" "<<di.id<<" "<<di.nid<<endl;
out.close();
}
string gettime()
{
string s,s1;
time_t t;
time(&t);
s=ctime(&t);
s1=s.substr(4,3);
s1+='#';
s1+=s.substr(8,2);
s1+='#';
s1+=s.substr(11,8);
s1+='#';
s1+=s.substr(20,4);
return s1;
}
void initinod(inode &ind,int i_n,int ud,int gd,int si,int link,
int addr[],
string mod,
string ct,
string lct)
{
int i;
ind.i_num=i_n;
ind.uid=ud;
ind.gid=gd;
ind.mode=mod;
ind.links=link;
ind.size=si;
ind.ctime=ct;
for(i=0;i<10;i++)
ind.di_addr[i]=addr[i];
ind.lctime=lct;
}
/////////////////////////////////////////
////////////////
dir finddir(string sdir)
{
dir d;
ifstream in;
in.open(dirfile.c_str());
while(!in.eof())
{
in>>d.fatherid>>d.dirname>>d.id>>d.nid;
if(d.dirname==sdir)
break;
}
in.close();
return d;
}
void deletedir(string sdir)
{
Stack<dir> stdir;
dir newdir1 ,newdir2;
finddir(sdir);
ifstream in;
in.open(dirfile.c_str());
while(!in.eof())
{
in>>newdir1.fatherid>>newdir1.dirname>>newdir1.id>>newdir1.nid;
stdir.push(newdir1);
if(newdir1.dirname==sdir)
newdir2=newdir1;
}
in.close();
ofstream out;
out.open(dirfile.c_str());
stdir.pop();
while(!stdir.StackEmpty())
{
if(stdir.Peek().id==newdir2.id||(stdir.Peek().fatherid==newdir2.id))
stdir.pop();
else
{
out<<stdir.Peek().fatherid<<" "<<stdir.Peek().dirname<<" "<<stdir.Peek().id<<" "<<stdir.Peek().nid<<endl;
stdir.pop();
}
}
out.close();
}
////////////////////////////////////////////////////////////////
bool login(string loginfile)
{
usr u;
ifstream in;
in.open(loginfile.c_str());
in>>u.usrname>>u.password>>u.uid>>u.gid;
in.close();
string username,pwd;
cout<<"please enter the username:";
cin>>username;
cout<<"please enter the password:";
{
char psw[256];
char ch;
int pos=0;
while ((ch=getch())!='\r')
{
if (ch=='\b')
{
pos--;
if (pos<0)
{
pos=0;
continue;
}
cout<<"\b \b";
}
else
{
if (pos<255)
{
psw[pos++]=ch;
cout<<'*';
}
}
}
psw[pos]='\0';
pwd=psw;
cout<<"\n"; }
if((username==u.usrname)&&(pwd==u.password))
return true;
else
return false;
}
void load(string filename,Stack<int> &Sinode,Stack<int> &Sdisk,Stack<int> &Sdirid)
{
int i,t;
ifstream in;
in.open(filename.c_str());
for(i=0;i<5;i++)
in>>t;
for(i=5;i<80;i++)
{
in>>t;
if(t>0)
Sinode.push(t);
}
for(i=0;i<3;i++)
in>>t;
for(i=0;i<100;i++)
{
in>>t;
if(t>0)
Sdisk.push(t);
}
for(i=0;i<5;i++)
in>>t;
for(i=0;i<32-5;i++)
{
in>>t;
if(t>0)
Sdirid.push(t);
}
in.close();
/*inode ind;
string s=gettime();
int addr[10]={0,0,0,0,0,0,0,0,0,0};
for(i=1;i<=5;i++)
{
initinod(ind,i,1,1,0,1,addr,"drwx",s,s);
writeinode(ind);
}*/
}
void deleteinode(int id)
{
Stack<inode> Sid;
inode newi1;
ifstream in;
in.open(inodefile.c_str());
while(!in.eof())
{
in>>newi1.i_num>>newi1.uid>>newi1.gid>>newi1.size>>newi1.links>>newi1.mode>>newi1.ctime>>newi1.lctime>>newi1.di_addr[0]>>newi1.di_addr[1]>>newi1.di_addr[2]>>newi1.di_addr[3]>>newi1.di_addr[4]>>newi1.di_addr[5]>>newi1.di_addr[6]>>newi1.di_addr[7]>>newi1.di_addr[8]>>newi1.di_addr[9];
if(newi1.i_num!=id)
Sid.push(newi1);
}
in.close();
ofstream out;
out.open(inodefile.c_str(),ios::trunc);//清空原文件
out.close();
//cout<<"Sid.recount()1:"<<Sid.recount()<<endl;
newi1=Sid.pop();//why/***************************************/
//cout<<"Sid.recount()2:"<<Sid.recount()<<endl;
writeinode(newi1);
//cout<<"Sid.recount()3:"<<Sid.recount()<<endl;
while(!Sid.StackEmpty())
writeinode(Sid.pop());
}
void wlockFBStacktf(int num)
{
ifstream in;
in.open(supbkfile.c_str());
int i;
int array[215];
for(i=0;i<215;i++)
in>>array[i];
in.close();
array[186]=num;
ofstream out;
out.open(supbkfile.c_str());
for(i=0;i<215;i++)
out<<array[i]<<endl;
out.close();
}
void wlockFIBStacktf(int num)
{
ifstream in;
in.open(supbkfile.c_str());
int i;
int array[215];
for(i=0;i<215;i++)
{
in>>array[i];
}
in.close();
array[187]=num;
ofstream out;
out.open(supbkfile.c_str());
for(i=0;i<215;i++)
out<<array[i]<<endl;
out.close();
}
void wfreeIBlockNtf(int num)
{
ifstream in;
in.open(supbkfile.c_str());
int i;
int array[215];
for(i=0;i<215;i++)
in>>array[i];
in.close();
array[81]=num;
ofstream out;
out.open(supbkfile.c_str());
for(i=0;i<215;i++)
out<<array[i]<<endl;
out.close();
}
void wfreeBlockNtf(int num)
{
ifstream in;
in.open(supbkfile.c_str());
int i;
int array[215];
for(i=0;i<215;i++)
in>>array[i];
in.close();
array[184]=num;
ofstream out;
out.open(supbkfile.c_str());
for(i=0;i<215;i++)
out<<array[i]<<endl;
out.close();
}
void winodeid(int flag,int num)//0 --分配,1--回收
{
ifstream in;
in.open(supbkfile.c_str());
int i;
int array[215];
for(i=0;i<215;i++)
in>>array[i];
in.close();
if(flag==1)
array[num-1]=num;
if(flag==0)
array[num-1]=0;
ofstream out;
out.open(supbkfile.c_str());
for(i=0;i<215;i++)
out<<array[i]<<endl;
out.close();
}
void wdiskid(int flag,int num)
{
ifstream in;
in.open(supbkfile.c_str());
int i;
int array[247];
for(i=0;i<247;i++)
in>>array[i];
in.close();
if(flag==1)
array[83+num-1]=num;
if(flag==0)
array[83+num-1]=0;
ofstream out;
out.open(supbkfile.c_str());
for(i=0;i<247;i++)
out<<array[i]<<endl;
out.close();
}
void wdirid(int flag,int num)
{
ifstream in;
in.open(supbkfile.c_str());
int i;
int array[215];
for(i=0;i<215;i++)
in>>array[i];
in.close();
if(flag==1)
array[183+num]=num;
if(flag==0)
array[183+num]=0;
ofstream out;
out.open(supbkfile.c_str());
for(i=0;i<215;i++)
out<<array[i]<<endl;
out.close();
}
int rlockFIBStackff()
{
int t;
ifstream in;
in.open(supbkfile.c_str());
for(int i=0;i<188;i++)
in>>t;
in.close();
return t;
}
int rlockFBStackff()
{
int t;
ifstream in;
in.open(supbkfile.c_str());
for(int i=0;i<187;i++)
in>>t;
in.close();
return t;
}
////////////////////////////////////////////////////////////////////
bool ialloc(Stack<int> &st,int &it,int addr[])
{
int t;
t=rlockFIBStackff();
if(t==1)
{
cout<<"超级块上锁,不能访问!"<<endl;
return false;
}
else
{
wlockFIBStacktf(1);//zhi chao ji kuai suo
if(st.StackEmpty())
{
cout<<"I 节点栈为空!"<<endl;
wlockFIBStacktf(0);
return false;
}
else
{
it=st.pop();
//winodeid(0,it);
wlockFIBStacktf(0);//qu xiao chao ji kuai suo
inode newd;
string ct,lct;
ct=gettime();lct=ct;
//int addr[10]={0,0,0,0,0,0,0,0,0,0};
initinod(newd,it,1,1,0,1,addr,"drwx",ct,lct);
writeinode(newd);
return true;
}
}
}
bool diskalloc(Stack<int> &st,int &it)
{
int t;
t=rlockFBStackff();
if(t==1)
{
cout<<"超级块上锁,不能访问!"<<endl;
return false;
}
else
{
wlockFIBStacktf(1);//zhi chao ji kuai suo
if(st.StackEmpty())
{
cout<<"磁盘块号栈为空!"<<endl;
wlockFBStacktf(0);
return false;
}
else
{
it=st.pop();
//wdiskid(0,it);
wlockFIBStacktf(0);//qu xiao chao ji kuai suo
return true;
}
}
}
dir finddir(int fatherid)
{
dir d;
ifstream in;
in.open(dirfile.c_str());
while(!in.eof())
{
in>>d.fatherid>>d.dirname>>d.id>>d.nid;
if(d.fatherid==fatherid)
break;
}
in.close();
return d;
}
inode findinode(int num)
{
inode ind;
ifstream in;
in.open(inodefile.c_str());
while(!in.eof())
{
in>>ind.i_num>>ind.uid>>ind.gid>>ind.size>>ind.links>>ind.mode>>ind.ctime>>ind.lctime
>>ind.di_addr[0]>>ind.di_addr[1]>>ind.di_addr[2]>>ind.di_addr[3]>>ind.di_addr[4]>>ind.di_addr[5]
>>ind.di_addr[6]>>ind.di_addr[7]>>ind.di_addr[8]>>ind.di_addr[9];
if(ind.i_num==num)
break;
}
in.close();
return ind;
}
int calculate(int size,int bnum)
{
int num1,num2;
num1=size/bnum;num2=size%bnum;
if(num2>0)
num1++;
return num1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -