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

📄 file.c

📁 操作系统实验源代码 用C++写的 包括 进程调度
💻 C
字号:
//tangfilesystem
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"
#include "time.h"
#include "windows.h"

#define getpch(type) (type*)malloc(sizeof(type))
#define null 0

int flag=0;//用于退出系统的标志flag=1时候退出系统
int usernum=0;//用于记录当前的用户个数,限制用户超过10个



struct mfd{         //主文件目录
char uname[12];		//用户名
struct ufd *flink;  //文件目录指针
struct mfd *unext;
}*mready=null,*mp,*ff;
typedef struct mfd MFD;


struct ufd{         //用户文件目录
char fname[12];		//文件名
int  pcode ;		//保护码
int length;         //文件长度
struct ufd* fnext; 
}*uready=null,*np;
typedef struct ufd UFD;


struct afd{        //运行文件目录
char openfname[12];//打开文件名
int  openpcode;    //打开保护码
int  rpoint;        //读指针
int  wpoint;       //写指针
                 
}*arunning=null,*ap;
typedef struct afd AFD;


/***********查看相同的用户***********/
bool  checkuser(MFD *mpc)
{
 MFD *first ;
    if(mready==null) 
	{
		return FALSE;//没有相同的
	}
	else 
	{   first=mready;
	     
		while(first!=null)
		{   if(strcmp(mpc->uname,first->uname)==0)return TRUE;
			first=first->unext;				
		}			
	}
return FALSE;
}

/*****************查看相同文件*******************/
bool  checkfile(UFD* npc)
{
 UFD *second ;
     
	    second=mready->flink;
	     
		while(second!=null)
		{   if((strcmp(npc->fname,second->fname)==0)&&(npc->pcode==second->pcode))return TRUE;
			second=second->fnext;			
		}			
	 
return FALSE;
}

/****************帮助*********************/
void help()
{
printf("============命令提示帮助============\n");
printf("\tcreate\t\t创建文件\n");
printf("\tdelete\t\t删除文件\n");
printf("\tclose\t\t关闭文件\n");
printf("\topen\t\t打开文件\n");
printf("\tread\t\t读取文件\n");
printf("\twrite\t\t写入文件\n");
printf("\texit\t\t退出用户\n");
printf("\thelp\t\t命令帮助\n");
printf("====================================\n");


}





/**********************显示文件******************************/
void fprint(MFD *f)  
{ 
	UFD *f1;
	f1=f->flink;
    printf("\n用户 < %s >的文件目录",f->uname);
    printf("\n文件名\t保护码\t长度\n");
	printf("-------------------------\n");
	if(f1==null) printf("文件目录为空!\n");
	else{
	while (f1!=null)
	{ printf("%s\t%d\t%d\n",f1->fname,f1->pcode,f1->length);	
	  f1=f1->fnext;	
	}
	}
	printf("-------------------------\n");

}


/*********************创建文件************************/
void createfile(MFD *f)      
{
UFD *fp;

fp=f->flink;
if(fp==null)
{
np=getpch(UFD);
printf("文件名:");
scanf("%s",np->fname);
printf("保护码:");
scanf("%d",&np->pcode);
printf("文件长:");
scanf("%d",&np->length);
f->flink=np;
np->fnext=null;
}

else
{

while(fp->fnext!=null)
{ fp=fp->fnext;
}
 
np=getpch(UFD);
printf("文件名:");
scanf("%s",np->fname);
printf("保护码:");
scanf("%d",&np->pcode);
printf("文件长:");
scanf("%d",&np->length);
if(checkfile(np)) printf("相同文件已经存在,无法创建!\n"); 
else{
fp->fnext=np;
np->fnext=null;
}
}
//fprint(f);
}


/************************删除文件***************************/
void fdelete(MFD *f)
{
UFD *fp,*fq;
char dename[12];

fp=f->flink;
if(fp==null)
{
printf("没有文件可供删除!\n");
}

else
{ 
printf("文件名:");
scanf("%s",dename);

if(strcmp(dename,fp->fname)==0) f->flink=fp->fnext;

else
	{fq=fp;
	fp=fp->fnext;
	while(fp!=null)
		{  if(strcmp(dename,fp->fname)==0) 
			{
				fq->fnext=fp->fnext;
				break;
			}
	
	       fq=fq->fnext;
		   fp=fp->fnext;
		}
	}
}

//fprint(f);
}

/**********************显示当前打开文件**********************/
void nowopenf(AFD* p)   
{ 
	printf("运行打开文件: %s 保护码:%d\n",p->openfname,p->openpcode);
  
}
/***********************打开文件***************************/
void open(MFD *f)
{
UFD *fp;
char oname[12];
int pc;

fp=f->flink;
if(fp==null)
{
printf("没有文件可供打开!\n");
}

else
{ 
printf("文件名:");
scanf("%s",oname);
printf("保护码:");
scanf("%d",&pc);

	do	{ 
		
	 
		if((strcmp(oname,fp->fname)==0)&&(fp->pcode==pc)) 
			{
				ap=getpch(AFD);
				strcpy(ap->openfname,fp->fname);
				ap->openpcode=fp->pcode;
				ap->rpoint=0;
				ap->wpoint=fp->length;
				if(arunning==null) {arunning=ap;nowopenf(arunning);}
				else printf("正在打开文件,不允许同时运行两个文件!\n");
				break;
			}
	
		   fp=fp->fnext;
		}while(fp->fnext==null);

     if(arunning==null) printf("文件不存在!\n");

}
}

/*****************关闭文件*************************/
void close()
{   if(arunning==null) printf("没有打开文件!\n");
    else
	{
	printf("关闭运行文件:%s\n",arunning->openfname);
	arunning=null;
	}
}
/*******************读取文件***********************/
void read(MFD *f)
{   
	open(f);
   if(arunning->openpcode==3) printf("文件不可读!\n");
   else 
   {
	   printf("读取文件中....\n");
	   for((arunning->rpoint)=0;(arunning->rpoint)<(arunning->wpoint);(arunning->rpoint)++)
	   { 
		   printf("> ");
	   Sleep(200);
	   }
	   printf("读取完毕!\n");	   
   }
	close();
   
}
/********************写入文件**********************/
void write(MFD *f)
{
int len,i;
UFD *fp;
fp=f->flink;
open(f);
if((arunning->openpcode==1)||(arunning->openpcode==3)) {printf("文件不可写!\n");close();}
else
{ printf("写入内容长度:");
  scanf("%d",&len);
  printf("写入文件中....\n");
  for(i=arunning->wpoint;i<(arunning->wpoint+len);i++)
	   { 
		   printf("> ");
	   Sleep(200);
	   }
     arunning->wpoint=arunning->wpoint+len;

while(fp!=null)
		{  if(strcmp(arunning->openfname,fp->fname)==0)  
				{fp->length=arunning->wpoint;
				break;
				}
	
		   fp=fp->fnext;
		}


	   printf("写入完毕!\n");
        close();



}

} 

/***********************文件操作选择**********************/
void opfile(MFD *f)  
{
char cmd[12];
while(1)
{
 
 printf("输入命令:>\\");

 scanf("%s",cmd);
 if(strcmp(cmd,"create")==0)  createfile(f);   //创建命令
 else if(strcmp(cmd,"delete")==0)  fdelete(f); //删除命令
 else if(strcmp(cmd,"read")==0)  read(f); //读取命令
 else if(strcmp(cmd,"write")==0)  write(f); //写入命令
 else if(strcmp(cmd,"open")==0)  open(f);      //打开命令
 else if(strcmp(cmd,"close")==0)  close();     //关闭命令
 else if(strcmp(cmd,"view")==0)  fprint(f);     //查看命令
 else if(strcmp(cmd,"exit")==0)  break;
 else if(strcmp(cmd,"help")==0)  help();     //帮助命令
}

}

/*****************插入用户到用户队列*******************/

void uinsert()  
{ 
    MFD *first,*second;

    if(mready==null) 
	{
		mp->unext=mready;
		mready=mp;
	}
	else 
	{   first=mready;
	    second=first->unext;
		while(second!=null)
		{   first=first->unext;
			second=second->unext;		
		}		
		first->unext=mp;
	}

    usernum=usernum+1;//增加一个用户
	 

}

/*********************添加多个用户*********************/
void uinit()     
{
	int i,n;
	
	printf("请输入创建用户个数: ");
RE: scanf("%d",&n);
	if(n>(10-usernum)) {printf("现在最多能创建的用户个数为%d,请重新输入创建个数:",(10-usernum));goto RE;}
	else
	{
    for(i=0;i<n;i++)
	{
RE2:	printf("=====第%d个用户=====\n",i+1);
    mp=getpch(MFD);	
    printf("用户名:");
	scanf("%s",mp->uname);
	mp->flink=null;
	mp->unext=null;
	if(checkuser(mp)) {printf("用户已经存在,请重新输入!\n");goto RE2;}
    uinsert(); 
	
	}
	}
}
/*********************创建单个用户*********************/
void usercre()     
{    
    if(usernum==10) printf("能创建的用户个数已经满,无法再创建用户!\n");
	else{
	printf("=====创建新用户=====\n");
    mp=getpch(MFD);	
    printf("用户名:");
	scanf("%s",mp->uname);
	mp->flink=null;
	mp->unext=null;
	if(checkuser(mp)) printf("用户已经存在,无法创建!\n");	
    else uinsert();    
	}
}


/*******************显示用户**************************/

void uprint()    
{	
	
	
	MFD *p=mready;
	int j=1;
	if(p==null)printf("当前没有用户!");
	else{
 while (p!=null)
 {
	printf("第%d个用户名是:",j);
	printf("%s\n",p->uname);
	p=p->unext;
	j++;
	}}
}



/*******************查询用户是否在列表中******************/

MFD* checkload(char name[12])   
{
MFD *a;
a=mready;
while(a!=null)
{
	if(strcmp(name,a->uname)==0) 
	{
		printf("\n找到用户!\n") ;
		return a;
	}
	a=a->unext;
}

printf("\n用户不存在!\n");

return null;


}

/********************登陆用户***********************/
MFD* load()        
{char name[12];
 MFD*f;

printf("\n请输入登陆用户名:");
scanf("%s",name);
f=checkload(name);
if(f!=null)
{
	fprint(f);
	return f;
}

else
return null;

}
/**********************主目录****************************/
void menu()
{int i;
REP:
printf("\t\t\t********** File System **********\n");
printf("\t\t\t\t1-用户登陆\n");
printf("\t\t\t\t2-创建单个用户\n");
printf("\t\t\t\t3-创建多个用户\n");
printf("\t\t\t\t4-查看所有用户\n");
printf("\t\t\t\t5-退出系统\n");
printf("\t\t\t*********************************\n");
scanf("%d",&i);
switch(i)
{
case 1:{
	ff=load();
	if(ff==null)goto REP;
	opfile(ff);
	break;
	   }
case 2:{usercre();goto REP;break;}
case 3:{ uinit();goto REP;break;}
case 4:{uprint() ; goto REP;break;}
case 5:{
	   flag=1;
	   if(arunning!=null)close();
	   break;}
	   }

}

/*********************主函数***********************/
void main ()
{
	while(flag==0)
	{
	menu();
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -