简单模拟操作系统中的文件操作(2)

本文续接上篇:简单模拟操作系统中的文件操作(1)!


下面给出实现的代码:

自定义头文件:

/*Author:WangXiaowei;Date:2012-06-19;Address:石家庄经济学院信息工程学院。*/
/*Explain:操作系统课程设计的题目7《文件操作》的头文件。*/
/*Take care:本程序中的管理员登录方式下的用户名为:administer,密码为:123456.*/
/*由于本程序的下面用到了延时函数Sleep(),所以本程序开始运行(初始化数据)时有点缓慢,请耐心等待。*/

#define CMD	12
//命令的最大长度为CMD
#define N	6
//MFD最大为N栏
#define L	8
//UFD最大为L栏
#define S	5
//UOF最大为S栏
#define F	1000
//文件目录表FAT的最长空间
#define UNL	16
//用户名的最大长度
#define FNL	15
//文件名的最大长度
#define FAT	int
//FAT即为int

typedef struct MFD
{
	char user_name[UNL];
	char ufd_add[FNL];
	char uof_add[FNL];
}MFD;
//主文件目录表
typedef struct UFD
{
	char file_name[FNL];
	int file_pow;
	int record_len;
	int file_add;
}UFD;
//用户文件目录表
typedef struct UOF
{
	char file_name[FNL];
	int file_pow;
	int record_len;
	int file_sta;
	int read_p;
	int write_p;
}UOF;  
//用户已打开文件目录表
typedef struct SORT_ADD
{
	int userid;
	int fileid;
	int start_add;
	int end_add;
}SORTADD;
//此结构体是为了存储对用户文件表中的文件地址排序后的起始地址,和结束地址。
//因为在新建文件时,要找到空闲的磁盘块分配,而文件操作中对地址的管理是全局的,是不分用户的。
//所以要在分配前先对文件地址排序。



主文件:

/*Author:WangXiaowei;Date:2012-06-19;Address:石家庄经济学院信息工程学院.*/
/*Explain:操作系统课程设计的题目7《文件操作》的源文件.*/
/*Take care:本程序中的管理员登录方式下的用户名为:administer,密码为:123456.*/
/*由于本程序的下面用到了延时函数Sleep(),所以本程序开始运行(初始化数据)时有点缓慢,请耐心等待.*/

#include<stdio.h>
#include<stdlib.h>
//使用rand()随机数时应使用此头文件.
#include<string.h>
#include<conio.h>
//因为mypassword()函数中用到了,控制台输入输出函数:getch()、kbhit()、cprintf().
#include<time.h>
//调用系统函数返回当前系统时间时用的函数,包含于此头文件中.
#include<windows.h>
//下面用到sleep()延时函数,它包含于此头文件中.
#include"myheadfile.h"


MFD main_file[N],* main_file_p;
UFD user_file[N-1][L],* user_file_p;
//[N-1]是为了排除管理员用户。
UOF user_open_file[N-1][S],* user_open_file_p;
//[N-1]是为了排除管理员用户.
FAT fat[F];
//文件目录表,fat的下标就是地址块号,块号的内容为-1表示记录结束.
SORTADD sor_add[(N-1)*L];
//因为最多有(N-1)个普通用户,L个文件,所以sor_add的大小应为(N-1)*L个.


struct tm *newtime;
long ltime;
int second;
//上面三句定义是为了存储当前系统时间中的秒数。



int initialize_mfd();//初始化主文件目录表(从文件读取).
int initialize_ufd(int);//初始化用户文件目录表(从文件读取).
int ufd_write_uof(int);
//把ufd文件中的数据写入uof文件,构成uof的部分数据。然后利用一般赋值语句,把剩余数据初始化(往文件中写).
int initialize_uof(int);//初始化已打开文件表(从文件读取).
int initialize_fat();//初始化FAT(文件目录)表.
int output_mfd();//输出主文件目录表.
int output_ufd(int);//输出用户文件目录表.
int output_uof(int);//输出用户已打开文件目录表.
int create(int,char * ,int ,int );//建立文件.
int open(int,char * ,int );//打开文件.
int read(int,char * ,int );//读文件.
int write(int,char * ,int );//写文件.
int close(int,char * );//关闭文件.
int delet(int,char * );//撤销文件.
int mypassword(char *);//实现密码的输入.
int log_in();//实现用户身份的验证.
int test_run_command(int);//实现命令的验证并运行.
int soradd();//对所有用户的所有文件的起始地址排序。
int ad_check_out();//管理员用户选择打印MFD、UFD、UOF,且对于UFD和UOF可以选择打印。
int check_out(int);//普通用户选择打印UFD和UOF,无权打印MFD。注意:普通用户只能打印自己的信息。


int main()
{
	int i;
	
	//下面获取当前系统时间中的秒数,是为了获取相对较好的伪随机数做准备.
	time(<ime);
	newtime=gmtime(<ime);
	//获取当前系统时间,并存放于结构体newtime中.
	second=newtime->tm_sec;
	//获取当前系统时间中的秒数,并存放于变量second中.
	
	fat[F]=0;

	initialize_mfd();
	
	for(i=0;i<N-1;i++)
	//因为要排除最后一个管理员身份,所以i<N-1.
	{
		initialize_ufd(i);
	}
	
	printf("正在进行数据初始化,请您耐心等待!\n");
	//由于下面的ufd_write_uof();函数中用到了延时函数。
	for(i=0;i<N-1;i++)
	//因为要排除最后一个管理员身份,所以i<N-1.
	{
		ufd_write_uof(i);
	}
	printf("\n");
	for(i=0;i<N-1;i++)
	{
		initialize_uof(i);
	}
	
	initialize_fat();
	
	log_in();
	
	return 0;
}

int initialize_mfd()
{
	int i;
	char accept;
	//由于文本中每一行数据结束的换行符仍留在输入流中,并将被作为下一个字被读入。
	//上面这个变量就是为了存储换行符。
	FILE * fp;
	main_file_p=main_file;
	
	if((fp=fopen("MFD.txt","rt+"))==NULL)
	//对MFD.txt,以文本方式,可读.
	{
		//printf("\nCannot open file strike any key exit!");
		printf("\n不能打开此文件,请按任意键退出!\n");
		getchar();
		//exit(1);
		return 0;
	}
	for(i=0;i<N;i++)
	{
		//fscanf(fp,"%[^,],%s%c",main_file_p[i].user_name,main_file_p[i].ufd_add,&accept);
		fscanf(fp,"%[^,],%[^,],%s%c",main_file_p[i].user_name,main_file_p[i].ufd_add,main_file_p[i].uof_add,&accept);
	}
	
	fclose(fp);
	//千万别忘了关闭文件。
	
	
	return 0;
}

int output_mfd()
{
	int i;
	printf("这是主文件目录表MFD:\n");
	printf("----------------------------------------------------------------\n");
	printf("用户名\t\t用户文件目录地址\t用户已打开文件目录地址\n");
	printf("----------------------------------------------------------------\n");
	for(i=0;i<N;i++)
	{
		//printf("%-15s\t%s\n",main_file[i].user_name,main_file[i].ufd_add);
		printf("%-15s\t%s\t\t%s\n",main_file[i].user_name,main_file[i].ufd_add,main_file[i].uof_add);
	}
	printf("----------------------------------------------------------------\n");
	
	return 0;
}

int initialize_ufd(int number)
{
	int i;
	char accept;
	//由于文本中每一行数据结束的换行符仍留在输入流中,并将被作为下一个字被读入。
	//上面这个变量就是为了存储换行符。
	FILE * fp;
	user_file_p=user_file[number];
	
	if((fp=fopen(main_file[number].ufd_add,"rt+"))==NULL)
	//对UFD.txt,以文本方式,可读.
	{
		//printf("\nCannot open file strike any key exit!");
		printf("\n不能打开此文件,请按任意键退出!\n");
		getchar();
		//exit(1);
		return 0;
	}
	for(i=0;i<L;i++)
	{
		fscanf(fp,"%[^,],%d,%d,%d%c",user_file_p[i].file_name,&user_file_p[i].file_pow,&user_file_p[i].record_len,&user_file_p[i].file_add,&accept);
	}
	
	fclose(fp);
	//千万别忘了关闭文件。
	
	
	return 0;
}

int output_ufd(int number)
{
	int i;
	printf("\n这是用户%s的文件目录表UFD%d:\n",main_file[number].user_name,number+1);
	printf("------------------------------------------------------------\n");
	//printf("file_name\tfile_pow\trecord_len\tfile_add\n");
	printf("文件名\t\t文件属性\t记录长度\t文件地址\n");
	printf("------------------------------------------------------------\n");
	for(i=0;i<L;i++)
	{
		printf("%-15s\t%d\t\t%d\t\t%d\n",user_file[number][i].file_name,user_file[number][i].file_pow,user_file[number][i].record_len,user_file[number][i].file_add);
		
	}
	printf("------------------------------------------------------------\n");
	return 0;
}

int ufd_write_uof(int number)
{
	int i,j,myrand[L]={0};
	int flag=0;
	//退出标记,为1时退出。
	FILE * fp;
	
	if((fp=fopen(main_file[number].uof_add,"wt+"))==NULL)
	//对UOF.txt,以文本方式,可读.
	{
		//printf("\nCannot open file strike any key exit!");
		printf("\n不能打开此文件,请按任意键退出!\n");
		getchar();
		//e
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值