题目要求:
编一个通过屏幕选择命令的文件管理系统,每屏要为用户提供足够的选择信息,不需要打入冗长的命令。
代码:
#include <iostream>
#include <string>
#include <conio.h>
using namespace std;
struct UFD //用户目录文件
{
string File_Name; //文件名
bool R,W,X; // 读写执行
int Len_File; //文件大小
};
struct MFD //主文件夹目录
{
string User_Name; //用户名
UFD * Pointer; //用户文件目录指针
};
struct AFD //运行文件目录
{
int File_ID;// 文件号
bool R, W, X;
int Pointer;//读写指针
};
class FILE_SYSTEM
{
public:
void Inital();
void Start();
private:
int Num_User; //用户数量
int Num_File; //每个用户可保存的文件数
int MAX_Open_File; //打开的最大文件数
MFD * Mfd; // 主文件目录
UFD * Ufd; // 用户文件目录
AFD * Afd; //运行文件目录
};
int main()
{
FILE_SYSTEM FS;
FS.Inital();
FS.Start();
return 0;
}
void FILE_SYSTEM::Inital()
{
Num_File = 10;
Num_User = 10;
MAX_Open_File = 5;
//UFD
Ufd = new UFD[Num_User*Num_File];
//MFD
Mfd = new MFD[Num_User];
for(int i = 0 ; i < Num_User; i++)
{
Mfd[i].Pointer = &(Ufd[i*Num_File]);
}
//AFD
Afd = new AFD[MAX_Open_File];
Mfd[0].User_Name="wzn";
Ufd[0].File_Name="1.txt";
Ufd[0].Len_File=10;
Ufd[0].R=true;
Ufd[0].W=false;
Ufd[0].X =false;
Ufd[1].File_Name="2.txt";
Ufd[1].Len_File=15;
Ufd[1].R=false;
Ufd[1].W=false;
Ufd[1].X =true;
for(int i = 2; i < Num_File; i++) //其他人没有文件存在
{
Ufd[i].File_Name="";
Ufd[i].Len_File=-1;
Ufd[i].R=false;
Ufd[i].W=false;
Ufd[i].X =false;
}
}
void showOrder()
{
cout << "Order list" << endl;
cout << "\t1. dir\t";
cout << "\t2. diropen" << endl;
cout << "\t3. create";
cout << "\t4. delete" << endl;
cout << "\t5. open\t";
cout << "\t6. logout" << endl;
cout << "\t7. close";
cout << "\t8. read" << endl;
cout << "\t9. write\t";
cout << "\t10. shutdown" << endl;
}
void FILE_SYSTEM::Start()
{
showOrder();
int User_ID,i;
int Num_Open_File,tmp_len; //当前用户打开文件数
string User_Name,tmp;//当前登录的用户名
int cmd; //用户输入命令
UFD * ufd;
char choice;
do //打开计算机
{
do
{
cout << "User Name:";
cin >> User_Name;
for(User_ID = 0; User_ID < Num_User; User_ID++)
{
if(Mfd[User_ID].User_Name == User_Name)
break;
}
if(User_ID == Num_User)
cout << "No such User name,please try again!" << endl;
}
while(User_ID == Num_User);
cout << "Welcome to login, " << User_Name << "!" << endl;
ufd = Mfd[User_ID].Pointer;
//初始化文件列表
for(i = 0 ; i < MAX_Open_File; i++)
{
Afd[i].File_ID = -1;
}
Num_Open_File = 0;
do //命令处理
{
//模拟命令行:
cout << "["<<User_Name<<"]~";
cin >> cmd;
if(cmd == 1)
{
cout << endl;
cout << "Owner of Files:" << User_Name << endl;
cout << "\tState\tLength\tFileName" << endl;
for(i = 0 ; i < Num_File; i++)
{
if(ufd[i].Len_File != -1)
{
cout << "\t";
if(ufd[i].R == true)cout << "R";
else cout << "-";
if(ufd[i].W == true)cout << "W";
else cout << "-";
if(ufd[i].X == true)cout << "X";
else cout << "-";
cout << "\t";
cout << ufd[i].Len_File << "\t";
cout << ufd[i].File_Name << endl;
}
}
cout << endl;
}
else if(cmd == 2)
{
cout << endl;
cout << "Opened Files of " << User_Name << endl;
cout << "\t" << "State\t" << "Open File name" << endl;
for(i = 0 ; i < MAX_Open_File; i++)
{
if(Afd[i].File_ID != -1)
{
cout << "\t";
if(Afd[i].R == true)cout << "R";
else cout << "-";
if(Afd[i].W == true)cout << "W";
else cout << "-";
if(Afd[i].X == true)cout << "X";
else cout << "-";
cout << "\t";
cout << ufd[Afd[i].File_ID].File_Name << endl;
}
}
cout << endl;
}
else if(cmd == 3)
{
for(i=0; i<Num_File; i++)
{
if(ufd[i].Len_File == -1)
break;
}
if(i == Num_File)
{
cout << "No Enough space!" << endl;
}
else
{
cout << "File's Information:" << endl;
cout << "File 's name:";
cin >> tmp;
ufd[i].File_Name = tmp;
cout << "Read(y/n):";
choice = getch();
if(choice == 'y')ufd[i].R = true;
else ufd[i].R = false;
cout << endl;
cout << "Write(y/n):";
choice = getch();
if(choice == 'y')ufd[i].W = true;
else ufd[i].W = false;
cout << endl;
cout << "Execute(y/n):";
choice = getch();
if(choice == 'y')ufd[i].X = true;
else ufd[i].X = false;
cout << endl;
cout << "Length:";
cin >> tmp_len;
if(tmp_len > 0)
ufd[i].Len_File = tmp_len;
cout << "New File: " << ufd[i].File_Name << " is Created" << endl;
}
}
else if(cmd == 4)
{
cout << "Enter Delete file name:";
cin >> tmp;
for(i = 0 ; i < Num_File; i++)
{
if((ufd[i].Len_File != -1) && (ufd[i].File_Name == tmp))
break;
}
if(i == Num_File)
{
cout << "NOT FOUND!" << endl;
}
else
{
ufd[i].Len_File = -1; //delete the file
cout << "The File:" << ufd[i].File_Name << " is deleted!" << endl;
}
}
else if(cmd == 5)
{
if(Num_Open_File == MAX_Open_File)
cout << "Can't Open anymore!" << endl;
else
{
cout << "Open file 's name:";
cin >> tmp;
for(i=0; i <Num_File; i++)
{
if((ufd[i].Len_File != -1)&& (ufd[i].File_Name == tmp))
break;
}
if(i == Num_File)
{
cout << "No such file" << endl;
}
else
{
int t;
Num_Open_File++;
for(t = 0; t < MAX_Open_File; i++)
if(Afd[t].File_ID == -1)
break;
Afd[t].File_ID = i;
Afd[t].Pointer = 0;//0
cout << "Open mode:" << endl;
if(ufd[i].R == 1)
{
cout << "Read(y/n):";
choice = getch();
if(choice == 'y')Afd[t].R = 1;
else Afd[t].R = 0;
}
else Afd[t].R = 0;
if(ufd[i].W == 1)
{
cout << "Write(y/n):";
choice = getch();
if(choice == 'y')Afd[t].W = 1;
else Afd[t].W = 0;
}
else Afd[t].W = 0;
if(ufd[i].X == 1)
{
cout << "Execute(y/n):";
choice = getch();
if(choice == 'y')Afd[t].X = 1;
else Afd[t].X = 0;
}
else Afd[t].X = 0;
cout << "The File:" << tmp << " is opened" << endl;
}
}
}
else if(cmd == 6)
{
cout << "bye~" << User_Name << endl;
break;
}
else if(cmd == 7)
{
cout << "Close File name:";
cin >> tmp;
for(i = 0 ; i < Num_File ; i++)
{
if((ufd[i].Len_File != -1) && (ufd[i].File_Name == tmp))
break;
}
if(i == Num_File)
{
cout << "Not found!" << endl;
}
else
{
int t;
for(t = 0 ; t < MAX_Open_File ; t++)
{
if(Afd[t].File_ID == i)
break;
}
if(t == MAX_Open_File)
cout << "Not found" << endl;
else
{
Afd[t].File_ID = -1;
Num_Open_File--;
cout << tmp << " is closed" << endl;
}
}
}
else if(cmd == 8)
{
cout << "Read file Name:";
cin >> tmp;
for(i = 0 ; i < Num_File; i++)
{
if(ufd[i].File_Name == tmp && ufd[i].Len_File != -1)
break;
}
if(i == Num_File)
{
cout << "Not Found" << endl;
}
else
{
int t;
for(t = 0 ; t < MAX_Open_File; t++)
{
if(Afd[t].File_ID == i)
break;
}
if(t == MAX_Open_File)
cout << "No Enough Space" << endl;
else
{
if(Afd[t].R == true)
{
cout << "You can read this file" << endl;
}
else
{
cout << "Error:Not have Power of Open" << endl;
}
}
}
}
else if(cmd == 9)
{
cout << "enter write file name:";
cin >> tmp;
for(i = 0 ; i < Num_File ; i++)
if(ufd[i].Len_File!=-1&&ufd[i].File_Name==tmp)
break;
if(i == Num_File)
{
cout << "No such file" << endl;
}
else
{
int t;
for(t = 0 ; t < MAX_Open_File; t++)
{
if(Afd[t].File_ID == i)
break;
}
if(t == MAX_Open_File)
{
cout << "The file:" << tmp << "is not open" <<endl;
}
else
{
if(Afd[t].W == true)
cout << "You can write this file" << endl;
else
cout << "Error:Not have Power of write" << endl;
}
}
}
else if(cmd == 10)
{
cout << "loging out ...." << endl;
cout << "bye~" << User_Name << endl;
cout << "Shutting down ..." << endl;
break;
}
else
{
cout << "Illegal command, please try again" << endl;
}
}
while(cmd != 10 && cmd != 6);
}
while(cmd != 10);
}