⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.cpp

📁 操作系统分页存储管理
💻 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 + -