版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
//Filesystem_operations.cpp:Definestheentrypointfortheconsoleapplication.//#include"stdafx.h"#include<iostream>#include<fstream>#include<vector>#include<string>#include<algorithm>//<math.h>#include<sstream>#include<iomanip>#include<conio.h>#include"filesystem_struct.h"usingnamespacestd;#defineNum16//每個(gè)用戶最大文件數(shù)#defineDISK_SIZE100MFDmfdlist[Num];UFDufdlist[Num];UOFuoflist[Num];DISKdisklist[DISK_SIZE];intcurrent_user_position;//當(dāng)前用戶在ufdlist中的位置//格式化磁盤voidformat_disk();//將更新后的物理塊的信息重新寫回磁盤voidback_disklist();//從磁盤中獲得物理塊的信息voidget_disklist();//將更新后的MFD重新寫回磁盤voidback_mfdlist();//從磁盤中獲得MFDvoidget_mfdlist();//將更新后的UFD重新寫回磁盤voidback_ufdlist();//從磁盤中獲得UFDvoidget_ufdlist();//在ufdlist中尋找可用的ufdintfind_empty_ufd();//在disklist中尋找可用的物理塊intfind_empty_block();//在mfdlist中尋找可用的mfdintfind_empty_mfd();//在用戶注銷后,去除ufdlist和uoflistvoidclear_alllist();//返回以block物理塊為第1個(gè)文件塊的文件的第length個(gè)字節(jié)所在的物理塊號intget_appointfile_block(intblock,intlength);//改變文件屬性voidchatt(stringfilename,charattribute);//改變文件擁有者voidchown(stringfilename,stringnew_owner);//關(guān)閉文件voidclose(stringfilename);//文件拷貝voidcopy(stringsrcFile,stringdesFile);//srcFile源文件,desFile目標(biāo)文件//建立文件voidcreat(stringfilename,charattribute);//刪除文件voiddelet(stringfilename);//列出該用戶下所有文件voidfiledir();//顯示本系統(tǒng)命令voidhelp();//用戶登陸voidlogin();//用戶登出voidlogout();//翻開文件voidopen(stringfilename,charattribute);//修改用戶密碼voidpasswd(stringoldPwd,stringnewPwd);//將文件讀指針開始的nbytes個(gè)字符讀到屏幕上voidread(stringfilename,intnbytes);//改變文件名voidchfname(stringsrcFile,stringdesFile);//顯示文件內(nèi)容voidoutfile(stringfilename);//將數(shù)據(jù)buffer的前nbytes個(gè)寫入到寫指針指定的位置voidwrite(stringfilename,stringbuffer,intnbytes);//從鍵盤輸入文件,可以包含任意字符(可見)。//當(dāng)輸入ctrl+z,表示輸入結(jié)束voidwrite(stringfilename);//命令調(diào)用入口函數(shù)voidrun();//格式化磁盤voidformat_disk(){ ofstreamoutfile; outfile.open("disk.txt",ios::binary); for(inti=0;i<DISK_SIZE;i++) { outfile<<string(512,'')<<'\n'; } outfile.seekp(0,ios::beg); for(i=0;i<DISK_SIZE;i++) { outfile<<(char)i; outfile<<'0'<<char(0)<<''; } outfile.close(); cout<<"系統(tǒng)格式化成功!所有用戶數(shù)據(jù)已經(jīng)清空!\n";}//將更新后的物理塊的信息重新寫回磁盤voidback_disklist(){ ofstreamoutfile; outfile.open("disk.txt",ios::binary|ios::in); for(inti=0;i<DISK_SIZE;i++) { outfile<<disklist[i].id<<disklist[i].flag<<disklist[i].next<<''; } outfile.close();}//從磁盤中獲得物理塊的信息voidget_disklist(){ ifstreaminfile; infile.open("disk.txt",ios::binary); for(inti=0;i<DISK_SIZE;i++) { disklist[i].id=infile.get(); disklist[i].flag=infile.get(); disklist[i].next=infile.get(); infile.ignore();//這里假設(shè)一行不會(huì)超過1000個(gè)字符,所以含義是忽略一行 } infile.close();}//將更新后的MFD重新寫回磁盤voidback_mfdlist(){ ofstreamoutfile; outfile.open("disk.txt",ios::binary|ios::in); outfile.seekp(513,ios::beg); for(inti=0;i<Num;i++) { outfile<<mfdlist[i].username<<string(14-mfdlist[i].username.size(),''); outfile<<mfdlist[i].userpwd<<string(14-mfdlist[i].userpwd.size(),''); outfile<<mfdlist[i].link<<string(3,''); } outfile.close();}//從磁盤中獲得MFDvoidget_mfdlist(){ ifstreaminfile; infile.open("disk.txt",ios::binary); infile.seekg(513); for(inti=0;i<Num;i++) { charusername[14]; infile.read(username,14); mfdlist[i].username=username; mfdlist[i].username=mfdlist[i].username.substr(0,mfdlist[i].username.find('')); charuserpwd[14]; infile.read(userpwd,14); mfdlist[i].userpwd=userpwd; mfdlist[i].userpwd=mfdlist[i].userpwd.substr(0,mfdlist[i].userpwd.find('')); mfdlist[i].link=infile.get(); infile.seekg(3,ios::cur); } infile.close();}//將更新后的UFD重新寫回磁盤voidback_ufdlist(){ ofstreamoutfile; outfile.open("disk.txt",ios::binary|ios::in); outfile.seekp(513*(current_user_position+2),ios::beg); for(inti=0;i<Num;i++) { outfile<<ufdlist[i].filename<<string(14-ufdlist[i].filename.size(),''); outfile<<ufdlist[i].attribute; outfile.write((char*)(&ufdlist[i].length),sizeof(int)); outfile<<ufdlist[i].first_physical_block; outfile<<string(12,''); } outfile.close();}//從磁盤中獲得UFDvoidget_ufdlist(){ ifstreaminfile; infile.open("disk.txt",ios::binary); infile.seekg(513*mfdlist[current_user_position].link); for(inti=0;i<Num;i++) { charfilename[14]; infile.read(filename,14); ufdlist[i].filename=filename; ufdlist[i].filename=ufdlist[i].filename.substr(0,ufdlist[i].filename.find('')); infile.get(ufdlist[i].attribute); infile.read((char*)(&ufdlist[i].length),sizeof(int)); infile.get(ufdlist[i].first_physical_block); infile.seekg(12,ios::cur); } infile.close();}//在ufdlist中尋找可用的ufdintfind_empty_ufd(){ for(inti=0;i<Num;i++) { if(ufdlist[i].filename=="") returni; } return-1;}//在disklist中尋找可用的物理塊intfind_empty_block(){ for(inti=18;i<DISK_SIZE;i++) { if(disklist[i].flag=='0') { //將其改為已分配 disklist[i].flag='1'; returni; } } return-1;}//在mfdlist中尋找可用的mfdintfind_empty_mfd(){ for(inti=0;i<Num;i++) { if(mfdlist[i].username=="") returni; } return-1;}//在用戶注銷后,去除ufdlist和uoflistvoidclear_alllist(){ for(inti=0;i<Num;i++) { ufdlist[i].filename=""; uoflist[i].filename=""; }}//返回以block物理塊為第1個(gè)文件塊的文件的第length個(gè)字節(jié)所在的物理塊號intget_appointfile_block(intblock,intlength){ intblockNum=length/512; if(blockNum==0) { returnblock; } intfirst_physical_block=block; for(inti=1;i<=blockNum;i++) { first_physical_block=disklist[first_physical_block].next; } returnfirst_physical_block;}//從鍵盤輸入文件,可以包含任意字符(可見)。//當(dāng)輸入ctrl+z,表示輸入結(jié)束stringinput_data_infile(){ strings; while(1) { intc=getch(); if(c==26)//ascii中的sub,即^Z { printf("^Z"); break; } if(c==13)//ascii中的cr,即回車 { printf("\n"); s+='\n'; } else { printf("%c",c); s+=char(c); } } returns;}//////////////////////////////////////////////////////////////////////////////////系統(tǒng)命令函數(shù),共有Num+1條命令/////////////////////////////////////////////////////////////////////////////////////////////改變文件屬性voidchatt(stringfilename,charattribute){ for(inti=0;i<Num;i++) { if(ufdlist[i].filename==filename) break; } if(i==Num) { cout<<"該文件不存在!\n"; return; } ufdlist[i].attribute=attribute; uoflist[i].attribute=attribute; cout<<"已成功改變文件屬性!\n";}//改變文件擁有者voidchown(stringfilename,stringnew_owner){ for(inti=0;i<Num;i++) { if(ufdlist[i].filename==filename) break; } if(i==Num) { cout<<"該文件不存在!\n"; return; } for(intk=0;k<Num;k++) { if(mfdlist[k].username==new_owner) break; } if(k==Num) { cout<<"該用戶不存在!\n"; return; } intoldufdindex=i; UFDoldufd=ufdlist[oldufdindex]; UFDoldownerufdlist[Num]; copy(ufdlist,ufdlist+Num,oldownerufdlist); intoldownerindex=current_user_position; current_user_position=k; //獲得新用戶的UFD get_ufdlist(); boolhavefile=false; intufdindex=-1; for(i=0;i<Num;i++) { if(ufdlist[i].filename==filename) { havefile=true; } if(ufdindex==-1&&ufdlist[i].filename=="") { ufdindex=i; } } if(ufdindex==-1) { cout<<"新用戶的文件總數(shù)已滿!\n"; //恢復(fù)舊用戶的UFD current_user_position=oldownerindex; copy(oldownerufdlist,oldownerufdlist+Num,ufdlist); return; } if(havefile) { cout<<"新用戶的已經(jīng)有同名文件!\n"; //恢復(fù)舊用戶的UFD current_user_position=oldownerindex; copy(oldownerufdlist,oldownerufdlist+Num,ufdlist); return; } ufdlist[ufdindex]=oldufd; back_ufdlist(); //恢復(fù)舊用戶的UFD current_user_position=oldownerindex; copy(oldownerufdlist,oldownerufdlist+Num,ufdlist); ufdlist[oldufdindex].filename=""; cout<<"已成功改變文件擁有者!\n";}//關(guān)閉文件voidclose(stringfilename){ for(inti=0;i<Num;i++) { if(uoflist[i].filename==filename) break; } if(i==Num) { cout<<"該文件未翻開!\n"; return; } //刪除UOF uoflist[i].filename=""; cout<<"已成功關(guān)閉文件!\n";}//文件拷貝voidcopy(stringsrcFile,stringdesFile)//srcFile源文件,desFile目標(biāo)文件{ for(inti=0;i<Num;i++) { if(ufdlist[i].filename==srcFile) break; } if(i==Num) { cout<<"源文件不存在!\n"; return; } if(srcFile==desFile) { cout<<"源文件和目標(biāo)文件重名!\n"; return; } for(intk=0;k<Num;k++) { if(ufdlist[k].filename==desFile) break; } if(k!=Num) { cout<<"目標(biāo)文件已經(jīng)存在!\n"; return; } ifstreaminfile; infile.open("disk.txt",ios::binary); intfirst_physical_block=ufdlist[i].first_physical_block; stringfile=""; intlength=ufdlist[i].length; //讀取源文件中的數(shù)據(jù),到file中 while(1) { infile.seekg(513*first_physical_block,ios::beg); if(length>512) { strings; getline(infile,s,'\n'); file+=s; length=length-512; first_physical_block=disklist[first_physical_block].next; } else { strings; getline(infile,s,'\n'); s=s.substr(0,length); file+=s; break; } } //建立目標(biāo)文件 creat(desFile,ufdlist[i].attribute); //將源文件中的數(shù)據(jù)寫入目標(biāo)文件中 write(desFile,file,file.size()); cout<<"已成功拷貝文件!\n";}//建立文件voidcreat(stringfilename,charattribute){ for(inti=0;i<Num;i++) { if(ufdlist[i].filename==filename) { cout<<"該文件已經(jīng)存在,不能重名!\n"; return; } } intufdNum=find_empty_ufd(); if(ufdNum==-1) { cout<<"文件總數(shù)已滿!\n"; return; } intfirst_physical_block=find_empty_block(); if(first_physical_block==-1) { cout<<"磁盤已滿!\n"; return; } //添加到ufdlist中 ufdlist[ufdNum].filename=filename; ufdlist[ufdNum].attribute=attribute; ufdlist[ufdNum].length=0; ufdlist[ufdNum].first_physical_block=first_physical_block; //添加到uoflist中 uoflist[ufdNum].filename=filename; uoflist[ufdNum].attribute=attribute; uoflist[ufdNum].length=0; uoflist[ufdNum].first_physical_block=first_physical_block; uoflist[ufdNum].state='0'; uoflist[ufdNum].readptr=0; uoflist[ufdNum].writeptr=0; cout<<"創(chuàng)立文件"<<filename<<"成功!\n";}//刪除文件voiddelet(stringfilename){ for(inti=0;i<Num;i++) { if(ufdlist[i].filename==filename) break; } if(i==Num) { cout<<"該文件不存在!\n"; return; } ufdlist[i].filename=""; //把文件在disk中占用的資源釋放 intfirst_physical_block=ufdlist[i].first_physical_block; for(intk=0;k<=ufdlist[i].length%512;k++) { disklist[first_physical_block].flag='0'; first_physical_block=disklist[first_physical_block].next; } //把文件從uoflist中刪除 for(i=0;i<Num;i++) { if(uoflist[i].filename==filename) { uoflist[i].filename=""; break; } } cout<<"刪除文件"<<filename<<"成功!\n";}//列出該用戶下所有文件voidfiledir(){ intcount=0;//計(jì)算文件個(gè)數(shù) for(inti=0;i<Num;i++) { if(ufdlist[i].filename!="") { count++; cout<<"\t"<<ufdlist[i].filename<<"\t"; if(ufdlist[i].attribute=='0') cout<<"--r--"; elseif(ufdlist[i].attribute=='1') cout<<"--w--"; elseif(ufdlist[i].attribute=='2') cout<<"-r-w-"; cout<<"\t"<<ufdlist[i].length<<"Byte(s)"; cout<<"\t"<<(int)ufdlist[i].first_physical_block<<"\n"; } } cout<<"\t\t\t共有文件"<<count<<"個(gè)\n";}//顯示本系統(tǒng)命令voidhelp(){ cout.setf(ios::left); cout<<"\t本文件系統(tǒng)命令用法如下:\n\n\n"; cout<<"文件操作的根本命令:\n"; cout<<setw(8)<<"creat"<<setw(10)<<"filename"<<setw(10)<<"attribute"<<"\t新建文件\n" <<"\t\t(attribute(屬性):0-read_only;1-write_only;2-read_write)\n"; cout<<setw(8)<<"open"<<setw(10)<<"filename"<<setw(10)<<"attribute"<<"\t翻開文件\n" <<"\t\t(attribute(屬性):0-read_only;1-write_only;2-read_write)\n"; cout<<setw(8)<<"close"<<setw(10)<<"filename"<<"\t\t關(guān)閉文件\n"; cout<<setw(8)<<"delet"<<setw(10)<<"filename"<<"\t\t刪除文件\n"; cout<<setw(8)<<"copy"<<setw(10)<<"源文件名"<<setw(10)<<"目標(biāo)文件名"<<"\t文件拷貝\n"; cout<<setw(8)<<"read"<<setw(10)<<"filename"<<setw(10)<<"pointer"<<"\t將文件讀指針開始的pointer個(gè)字符讀到屏幕上\n"; cout<<setw(8)<<"write"<<setw(10)<<"filename"<<"\t從鍵盤輸入數(shù)據(jù)字符寫到文件中,結(jié)束時(shí)按Ctrl+Z\n" <<"\t\t(可以輸入任意可見字符,包括空格、回車!)\n"; cout<<setw(8)<<"write"<<setw(10)<<"filename"<<setw(10)<<"buffer"<<setw(10)<<"pointer"<<"\t將數(shù)據(jù)buffer的前pointer個(gè)字符寫入文件中\(zhòng)n" <<"\t\t(輸入的字符之間不能有空格!)\n"; cout<<setw(8)<<"outfile"<<setw(10)<<"filename"<<"\t\t顯示文件內(nèi)容到屏幕\n"; cout<<setw(8)<<"chfname"<<setw(10)<<"源文件名"<<setw(10)<<"目標(biāo)文件名"<<"\t改變文件名\n"; cout<<setw(8)<<"chown"<<setw(10)<<"filename"<<setw(10)<<"new_owner"<<"\t改變文件擁有者\(yùn)n"; cout<<setw(8)<<"chatt"<<setw(10)<<"filename"<<setw(10)<<"attribute"<<"\t改變文件屬性\n" <<"\t\t(attribute(屬性):0-read_only;1-write_only;2-read_write)\n"; cout<<setw(8)<<"filedir"<<"\t\t\t列出該用戶下所有文件\n" <<"\t\t(輸出格式:文件名屬性大小文件始指針)\n\n"; cout<<"用戶登錄注銷命令:\n"; cout<<setw(8)<<"help"<<"\t\t\t顯示本系統(tǒng)所有命令\n"; cout<<setw(8)<<"login"<<setw(10)<<"userName"<<setw(10)<<"pwd"<<"\t用戶登陸命令\n"; cout<<setw(8)<<"logout"<<"\t\t\t用戶注銷\n"; cout<<setw(8)<<"passwd"<<setw(10)<<"oldPwd"<<setw(10)<<"newPwd"<<"\t修改用戶密碼\n"; }//用戶登陸voidlogin(){ while(1) { cout<<">"; vector<string>command; chart[50]; cin.getline(t,50); strings; for(stringstreamsin(t);sin>>s;command.push_back(s)); if(command.empty()) continue; if(command[0]=="exit") { exit(0); } if(command[0]!="login") { cout<<"請使用login命令登陸!\n"; continue; } if(command.size()!=3) { cout<<"請正確地輸入用戶名和密碼!\n"; continue; } stringname=command[1]; stringpassword=command[2]; for(inti=0;i<Num;i++) { if(mfdlist[i].username==name) break; } if(i<Num) { if(password==mfdlist[i].userpwd) { current_user_position=i; get_ufdlist(); cout<<"歡送老用戶的歸來:"<<name<<"\n"; return; } for(inttime=1;time<=3;time++) { cout<<"密碼錯(cuò)誤,請重輸:(注:輸入錯(cuò)誤到達(dá)三次會(huì)自動(dòng)退出系統(tǒng))"; cin>>password; if(password==mfdlist[i].userpwd) { current_user_position=i; get_ufdlist();cin.ignore(); cout<<"歡送老用戶的歸來:"<<name<<"\n"; return; } } if(time>3) { cout<<"錯(cuò)誤次數(shù)太多!再見\n"; exit(0); } } else { MFDmfd; mfd.username=name; mfd.userpwd=password; current_user_position=find_empty_mfd(); if(current_user_position==-1) { cout<<"用戶總數(shù)已滿!無法添加新用戶!\n"; continue; } mfd.link=current_user_position+2; mfdlist[current_user_position]=mfd; get_ufdlist(); cout<<"您是新用戶,歡送你的使用:"<<name<<"\n"; cout<<"假設(shè)你對本系統(tǒng)的命令不熟悉,請輸入help查看!"<<"\n"; return; } } }//用戶登出voidlogout(){ back_disklist(); back_mfdlist(); back_ufdlist(); clear_alllist();//在用戶注銷后,去除ufdlist和uoflist cout<<""<<mfdlist[current_user_position].username<<"您已經(jīng)注銷!\n"; cout<<"退出系統(tǒng),請輸入exit命令!\n";}//翻開文件voidopen(stringfilename,charattribute){ for(inti=0;i<Num;i++) { if(ufdlist[i].filename==filename) break; } if(i==Num) { cout<<"該文件不存在!\n"; return; } if(ufdlist[i].attribute!=attribute) { cout<<"文件屬性不合法!不能翻開文件!\n"; return; } if(uoflist[i].filename!="") { if(uoflist[i].state=='1') cout<<"錯(cuò)誤!文件已經(jīng)翻開!\n"; else cout<<"錯(cuò)誤!文件正在建立!\n"; return; } uoflist[i].filename=ufdlist[i].filename; uoflist[i].attribute=ufdlist[i].attribute; uoflist[i].length=ufdlist[i].length; uoflist[i].first_physical_block=ufdlist[i].first_physical_block; uoflist[i].state='1'; uoflist[i].readptr=0; uoflist[i].writeptr=0; cout<<"翻開文件"<<filename<<"成功!\n"; }//修改用戶口令voidpasswd(stringoldPwd,stringnewPwd){ if(mfdlist[current_user_position].userpwd!=oldPwd) { cout<<"舊密碼錯(cuò)誤!\n"; return; } mfdlist[current_user_position].userpwd=newPwd; cout<<"已成功修改密碼!\n"; }//將文件讀指針開始的nbyte個(gè)字符讀到屏幕上voidread(stringfilename,intnbytes){ for(inti=0;i<Num;i++) { if(uoflist[i].filename==filename) break; } if(i==Num) { cout<<"該文件未翻開!\n"; return; } if(uoflist[i].attribute=='1') { cout<<"該文件只寫!\n"; return; } ifstreaminfile; infile.open("disk.txt",ios::binary); intfirst_physical_block=get_appointfile_block(uoflist[i].first_physical_block,uoflist[i].readptr); intoffset=uoflist[i].readptr%512; uoflist[i].readptr+=nbytes; stringread=""; intlength=nbytes; while(1) { infile.seekg(513*first_physical_block+offset,ios::beg); if(length+offset>512) { chara[513]; infile.read(a,512-offset); strings=a; read=read+s; length=length-512-offset; first_physical_block=disklist[first_physical_block].next; offset=0; } else { chara[513]; infile.read(a,512); strings=a; s=s.substr(0,length); read+=s; break; } } cout<<read<<"\n";}//改變文件名voidchfname(stringsrcFile,stringdesFile){ boolhavesrcFile=false; boolhavedesFile=false; intt=-1; for(inti=0;i<Num;i++) { if(ufdlist[i].filename==srcFile) { havesrcFile=true; if(t==-1)t=i; } if(ufdlist[i].filename==desFile) { havedesFile=true; } } if(!havesrcFile) { cout<<"該文件不存在!\n"; return; } if(havedesFile) { cout<<"存在一個(gè)重名文件!\n"; return; } ufdlist[t].filename=desFile; uoflist[t].filename=desFile; cout<<"已成功改變文件名!\n";}//顯示文件內(nèi)容voidoutfile(stringfilename){ for(inti=0;i<Num;i++) { if(ufdlist[i].filename==filename) break; } if(i==Num) { cout<<"該文件不存在!\n"; return; } intfirst_physical_block=ufdlist[i].first_physical_block; intlength=ufdlist[i].length; stringfile=""; ifstreaminfile; infile.open("disk.txt",ios::binary); while(1) { infile.seekg(513*first_physical_block,ios::beg); if(length>512) { chara[513]; infile.read(a,512); strings=a; s=s.substr(0,512); file+=s; length=length-512; first_physical_block=disklist[first_physical_block].next; } else { chara[513]; infile.read(a,512); strings=a; s=s.substr(0,length); file+=s; break; } } cout<<file<<endl;}//將buffer中的nbytes個(gè)字符寫入到寫指針指定的位置voidwrite(stringfilename,stringbuffer,intnbytes){ for(inti=0;i<Num;i++) { if(uoflist[i].filename==filename) break; } if(i==Num) { cout<<"該文件未翻開!\n"; return; } if(uoflist[i].attribute=='0') { cout<<"該文件只讀!\n"; return; } if(buffer.size()>nbytes) buffer=buffer.substr(0,nbytes); if(buffer.size()<nbytes) nbytes=buffer.size(); intfirst_physical_block=get_appointfile_block(uoflist[i].first_physical_block,uoflist[i].writeptr); intoffset=uoflist[i].writeptr%512; uoflist[i].writeptr+=nbytes; boolisadd=false; if(uoflist[i].writeptr>uoflist[i].length) { uoflist[i].length=uoflist[i].writeptr; ufdlist[i].length=uoflist[i].writeptr; isadd=true; } ofstreamoutfile; outfile.open("disk.txt",ios::binary|ios::in); while(1) { outfile.seekp(513*first_physical_block+offset,ios::beg); if(buffer.size()>512-offset) { outfile<<buffer.substr(0,512-offset); buffer=buffer.substr(512-offset,buffer.size()-512); //找下一個(gè)物理塊 if(disklist[first_physical_block].next==0) { disklist[first_physical_block].next=find_empty_block(); if(first_physical_block==-1) { cout<<"磁盤已滿!未能全部寫入!\n"; return; } } first_physical_block=disklist[first_physical_block].next; offset=0; } else { outfile<<buffer; if(isadd) outfile<<string(512-buffer.size(),''); break; } } cout<<"已成功寫入文件!\n"; }//從鍵盤輸入文件,可以包含任意字符(可見)。//當(dāng)輸入ctrl+z,表示輸入結(jié)束voidwrite(stringfilename){ for(inti=0;i<Num;i++) { if(uoflist[i].filename==filename) break; } if(i==Num) { cout<<"該文件未翻開!\n"; return; } if(uoflist[i].attribute=='0') { cout<<"該文件只讀!\n"; return; } //把文件在disk中占用的資源釋放,除第一個(gè)物理塊外 intfirst_physical_block=uoflist[i].first_physical_block; first_physical_block=disklist[first_physical_block].next; for(intk=1;k<=ufdlist[i].length%512;k++) { disklist[first_physical_block].flag='0'; first_physical_block=disklist[first_physical_block].next; } cout<<"請輸入文件內(nèi)容,結(jié)束時(shí)按Ctrl+Z\n"; //從控制臺中獲得文件 stringfile=input_data_infile(); first_physical_block=uoflist[i].first_physical_block; uoflist[i].writeptr=file.size(); uoflist[i].length=file.size(); ufdlist[i].length=file.size(); ofstreamoutfile; outfile.open("disk.txt",ios::binary|ios::in); while(1) { outfile.seekp(513*first_physical_block,ios::beg); if(file.size()>512) { outfile<<file.substr(0,512); file=file.substr(512,file.size()-512); //找下一個(gè)物理塊 if(disklist[first_physical_block].next==0) { disklist[first_physical_block].next=find_empty_block(); if(first_physical_block==-1) { cout<<"磁盤已滿!未能全部寫入!\n"; return; } } first_physical_block=disklist[first_physical_block].next; } else { outfile<<file; outfile<<string(512-file.size(),''); break; } } cout<<"\n已成功寫入文件!\n";}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////voidrun(){ stringERROR="命令的參數(shù)錯(cuò)誤!\n"; while(1) { cout<<mfdlist[current_user_position].username<<">"; vector<string>command; chart[1000]; cin.getline(t,1000); strings; for(stringstreamsin(t);sin>>s;command.push_back(s)); if(command.empty()) continue; if(command[0]=="chatt") { if(command.size()!=3) cout<<ERROR; else { if(command[2]!="0"&&command[2]!="1"&&command[2]!="2") cout<<ERROR; elsechatt(command[1],command[2][0]); } } elseif(command[0]=="chown") { if(command.size()!=3) cout<<ERROR; else chown(command[1],command[2]); } elseif(command[0]=="close") { if(command.size()!=2) cout<<ERROR; else close(command[1]); } elseif(command[0]=="copy") { if(command.size()!=3) cout<<ERROR; else { copy(command[1],command[2]); } } elseif(command[0]=="creat") { if(command.size()!=3) cout<<ERROR; else { if(command[2]!="0"&&command[2]!="1"&&command[2]!="2") cout<<ERROR;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024解除合同的分析范文
- 2024知識產(chǎn)權(quán)使用授權(quán)合同范本
- 蘇州科技大學(xué)天平學(xué)院《室內(nèi)陳設(shè)藝術(shù)設(shè)計(jì)一》2021-2022學(xué)年第一學(xué)期期末試卷
- 承壓類特種設(shè)備安全管理考核試卷
- 《口腔修復(fù)學(xué)簡介》課件
- 公共設(shè)施維修與保養(yǎng)考核試卷
- 如何編制有效的消防預(yù)案考核試卷
- 農(nóng)業(yè)科學(xué)與農(nóng)產(chǎn)品原料考核試卷
- 《玉米加工》課件
- 2024個(gè)人向公司借款合同樣本
- 長沙市某辦公建筑的冰蓄冷空調(diào)系統(tǒng)的設(shè)計(jì)畢業(yè)設(shè)計(jì)
- 不抱怨的世界(課堂PPT)
- 企業(yè)盈利能力分析——以青島啤酒股份有限公司為例
- 消火栓滅火器檢查記錄表
- 岸墻、翼墻及導(dǎo)水墻砼澆筑方案
- 第三章_配位化學(xué)
- 中國話-完整版PPT課件
- 纏論基本概念圖解(推薦)
- 海瑞克英文翻譯
- 培訓(xùn)師經(jīng)常用到的七大培訓(xùn)方式及操作方法
- 魯教版美術(shù)九年級下冊教學(xué)設(shè)計(jì)
評論
0/150
提交評論