📄 file.cpp
字号:
// 实验五 文件系统
// 采用两级目录结构,主文件目录[MFD],用户文件目录[UED],运行文件目录[AFD]
// 简单的文件模拟系统,实现文件的管理和控制
// Copyright 2008 , freedomer
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#define NULL 0
int c=5;/*打开文件数最大为5*/
struct file{
char name[10];
int code;//保护码,1-只读;2-只写;3-读写
int length;
char r_wpoint;//读写指针,初始化为0,读'R',写'W'
};
struct user{
char name[10];
struct file *list;//目录指针
};
//为每个用户初始化6个文件,总共文件数为10;为用户文件目录,UFD
file UFD_A[10]={
{"a0",1,10,0},{"a1",2,10,0},{"a2",3,10,0},{"a3",1,10,0},{"a4",2,10,0},{"a5",3,10,0},
};
file UFD_B[10]={
{"b0",1,10,0},{"b1",2,10,0},{"b2",3,10,0},{"b3",1,10,0},{"b4",2,10,0},{"b5",3,10,0},
};
file UFD_C[10]={
{"c0",1,10,0},{"c1",2,10,0},{"c2",3,10,0},{"c3",1,10,0},{"c4",2,10,0},{"c5",3,10,0},
};
file UFD_D[10]={
{"d0",1,10,0},{"d1",2,10,0},{"d2",3,10,0},{"d3",1,10,0},{"d4",2,10,0},{"d5",3,10,0},
};
file UFD_E[10]={
{"e0",1,10,0},{"e1",2,10,0},{"e2",3,10,0},{"e3",1,10,0},{"e4",2,10,0},{"e5",3,10,0},
};
file UFD_F[10]={
{"f0",1,10,0},{"f1",2,10,0},{"f2",3,10,0},{"f3",1,10,0},{"f4",2,10,0},{"f5",3,10,0},
};
file UFD_G[10]={
{"g0",1,10,0},{"g1",2,10,0},{"g2",3,10,0},{"g3",1,10,0},{"g4",2,10,0},{"g5",3,10,0},
};
file UFD_H[10]={
{"h0",1,10,0},{"h1",2,10,0},{"h2",3,10,0},{"h3",1,10,0},{"h4",2,10,0},{"h5",3,10,0},
};
file UFD_I[10]={
{"i0",1,10,0},{"i1",2,10,0},{"i2",3,10,0},{"i3",1,10,0},{"i4",2,10,0},{"i5",3,10,0},
};
file UFD_J[10]={
{"j0",1,10,0},{"j1",2,10,0},{"j2",3,10,0},{"j3",1,10,0},{"j4",2,10,0},{"j5",3,10,0},
};
//初始化十个用户记录,为主文件目录MFD
user MFD[10]={
{"A",UFD_A},{"B",UFD_B},{"C",UFD_C},{"D",UFD_D},{"E",UFD_E},
{"F",UFD_F},{"G",UFD_G},{"H",UFD_H},{"I",UFD_I},{"J",UFD_J}
};
//运行文件目录AFD,用户最多可以打开5个文件
file AFD[5];
void disp(user MFD); //显示参数为MFD的用户的文件
void reset (file AFD[5]);//将运行文件目录AFD清空
void run(user MFD); //命令操作函数,通过选择命令来对文件进行管理和控制
void create(user MFD); //在MFD用户中创建文件
void delet(user MFD); //在MFD用户中删除文件
void open(user MFD); //在MFD用户中打开文件
void close(user MFD); //在MFD用户中关闭文件
void read(); //读文件
void write(); //写文件
void disp(user MFD) {
printf("-------------------------------------------------------------------------------\n");
printf("\t\t\t%s用户的所有文件如下:\n\n",MFD.name);
for(int i=0;i<10;i++)
{
printf("%s\t",MFD.list[i].name);
}
}
//每次用户退出,重新登陆另一用户时,要初始化AFD
void reset (file AFD[]) {
for(int i=0; i<5;i++) {
strcpy(AFD[i].name,"");//修改文件名为空
AFD[i].code=0; //清空文件属性
AFD[i].r_wpoint=0;
AFD[i].length=0;
}
}
//创建文件,未达文件最大数就可以创建,输入文件名和相应的文件属性
void create(user MFD) {
char filename[10];
int i,j=0,flag;
for(i = 0; i < 10; i++) {
if(strcmp(MFD.list[i].name,"")!=0)/*数组未被初始化的元素的名字为空*/
j++;
}
if(j == 10)
{ printf("\n文件数己达上限值10,请先删除无用文件!\n");
run(MFD);
}
else/*数组未满,可以创建新的文件*/
{
do
{ printf("\n请输入文件名:");
scanf("%s",&filename);
flag=0;
for(i=0;i<10;i++)
{ if(strcmp(MFD.list[i].name,filename)==0)/*文件重名*/
{ printf("\n文件名重复,请重新输入");
flag=1; break;
}
}
}while(flag==1);
for(i=0;i<10;i++)
{ if(strcmp(MFD.list[i].name,"")==0)//找到数组中文件名为空的位置
{ strcpy(MFD.list[i].name,filename);
do
{
printf("\n请输入保护码(选择1-3,1-可读,2-可写,3-可读写):");
scanf("%d",&MFD.list[i].code);
if(MFD.list[i].code!=1&&MFD.list[i].code!=2&&MFD.list[i].code!=3)
printf("\n输入错误,重新输入保护码");
}while(MFD.list[i].code!=1&&MFD.list[i].code!=2&&MFD.list[i].code!=3);
printf("\n请输入文件长度:");
scanf("%d",&MFD.list[i].length);
printf("\n创建文件%s成功!\n",MFD.list[i].name);
break;
}
}
}
}
//删除文件,并不是真的回收它的空间,只是将文件名改为空,文件属性清0而已
void delet(user MFD) {
char filename[10];
int i;
do {
printf("\n请输入要删除的文件名:");
scanf("%s",&filename);
for(i = 0;i < 10;i++) {
if(strcmp(MFD.list[i].name,filename)==0)//找到这个文件
{
strcpy(MFD.list[i].name,"");//清空文件属性
MFD.list[i].code = 0;
MFD.list[i].r_wpoint = 0;
MFD.list[i].length = 0;
printf("\n删除文件%s成功!\n",filename);
break;
}
}
if(i==10)
printf("\n找不到此文件,请重新输入!\n");
}while(i==10);
}
//打开文件,先检查AFD是否已满,不满才打开,每成功打开一个文件,c自减
void open(user MFD)
{ char filename[10];
int i,j;
if(c==0)
printf("\n已经打开5个文件了,不可再打开了!要打开请先关闭无用文件!\n");
else {
do {
printf("\n请输入文件名:");
scanf("%s",&filename);
for(i=0;i<10;i++) {
if(strcmp(MFD.list[i].name,filename)==0)//找到文件
break;
}
if(i==10)
printf("找不到此文件,请重新输入!");
}while(i==10);
for(j=0;j<5;j++) {//检查此文件是否在打开队列中
if(strcmp(AFD[j].name,filename)==0) {//如果有这个文件
printf("\n此文件已经在打开队列里了!不能重复打开文件!\n");
break;
}
}
if(j == 5) {//未曾打开过此文件
for (int k = 0; k<5; k++) {
if(strcmp(AFD[k].name,"")==0){
AFD[k]=MFD.list[i];
printf("\n打开文件%s成功!\n",filename);
c--;
break;
}
}
}
}
}
//关闭文件,先要检查AFD中是否存在此文件,每成功关闭一个文件,c自加
void close(user MFD) {
char filename[10];
int i;
printf("\n请输入文件名:");
scanf("%s",&filename);
for(i=0;i<5;i++) {
if(strcmp(AFD[i].name,filename)==0){//找到这个文件
strcpy(AFD[i].name,"");//修改文件名为空
AFD[i].code=0;//清空文件属性
AFD[i].r_wpoint=0;
AFD[i].length=0;
c++;
printf("\n关闭文件%s成功!\n",filename);
break;
}
}
if(i==5)
printf("\n出错,请确认输入的文件是否存在且是否已被打开!\n");
}
//读文件,要在打开的文件队列里找文件来读
void read() {
char filename[10];
int i;
printf("\n请输入文件名:");
scanf("%s",&filename);
for(i=0;i<5;i++) {
if(strcmp(AFD[i].name,filename)==0) {//在AFD中找到这个文件
if(AFD[i].code==1||AFD[i].code==3) {
AFD[i].r_wpoint='R';
printf("\n正在读文件%s...\n",filename);
}
else //其属性不允许读
printf("\n此文件不允许读!\n");
break;
}
}
if(i == 5)
printf("\n运行队列中无此文件,请先打开文件!\n");
}
//写文件,要在打开的文件队列里找文件来写
void write() {
char filename[10];
int i;
printf("\n请输入文件名:");
scanf("%s",&filename);
for(i=0;i<5;i++) {
if(strcmp(AFD[i].name,filename)==0) {
if(AFD[i].code==2||AFD[i].code==3) {
AFD[i].r_wpoint='W';
printf("\n正在写文件%s...\n",filename);
}
else
printf("\n此文件不允许写!\n");
break;
}
}
if(i == 5)
printf("\n运行队列中无此文件,请先打开文件!\n");
}
//根据操作命令来管理文件
void run(user MFD) {
int choosecmd;
do {
disp(MFD);
printf("-------------------------------------------------------------------------------\n");
printf(" 1.Create 2.Delete 3.Open 4.Close 5.Read 6.Write 0.用户退出\n");
printf("\n请输入命令序号:");
scanf("%d",&choosecmd);
switch (choosecmd) {
case 0 : c=5;reset(AFD);break;//用户退出,c和AFD要复位
case 1 : create(MFD);break;
case 2 : delet(MFD);break;
case 3 : open(MFD);break;
case 4 : close(MFD);break;
case 5 : read();break;
case 6 : write();break;
default : printf("\n出错,请重新输入!\n");break;
}
}while(choosecmd!=0);
}
void main(){
int chooseuser;
do{
printf("-------------------------------------------------------------------------------");
printf("\n\t\t\t***系统共有如下10个用户***\n");
printf("-------------------------------------------------------------------------------");
printf("\n\t\t1.A\t2.B\t3.C\t4.D\t5.E\n\t\t6.F\t7.G\t8.H\t9.I\t10.J\n\t\t0.退出系统\n");
printf("\n请输入用户名序号登陆系统:");
scanf("%d",&chooseuser);//输入所选择的序号对应用户名在MFD数组中的地址+1
if(chooseuser!=0)
run(MFD[chooseuser-1]);
}while(chooseuser!=0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -