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

📄 文件索引.cpp

📁 操作系统各个方面的编程
💻 CPP
字号:
/*磁盘索引文件*/
# include<stdio.h>
# include<stdlib.h>
/*文件系统定义的数据结构*/
struct index       /*文件索引表的定义*/
{
	int lr[32];   /*逻辑块号数组*/
	int pr[32];  /*物理块号数组*/
	char st[32];/*状态数组*/
} * wq;
struct list
{
	char names[32];/*文件名*/
	int size[32]; /*文件大小*/
	struct index *p[32];/*文件的索引表地址*/
} * HEAD;
struct que
{
	char name;
	int size;
	struct que *next;
} *job,*top,*head;  /*定义一个作业清单*/
int i,j,ly,li;
char bb;        //定义一个输入回车键的字符
int N=0;       /*N代表系统的总文件数*/
int M=32;     /*M代表系统中空闲磁盘块数*/
int J[4][8]; /*定义一个人四维数组*/
FILE *e;    //定义一个文件指针
int jobs=0;/*初始化jobs*/
void run()/**/
{
	int x,y,z;
	int FIND=0;
	for(x=0;x<N;x++)
        if(HEAD->names[x]==top->next->name)
		FIND=1;
	if(FIND==0)
	{
		if(top->next->size<=M)
		{
			ly=0;
			M-=top->next->size;
			HEAD->names[N]=top->next->name;
			HEAD->size[N]=top->next->size;
			wq=(struct index *)malloc(sizeof(struct index));//申请内存空间
			HEAD->p[N]=wq;
			N++;
			for(z=0;z<32;z++)
			{
				wq->lr[z]=z;
				wq->pr[z]=0;
				wq->st[z]='N';
			}
			for(j=0;(j<4)&&(ly<top->next->size);j++)
				for(i=0;(i<8)&&(ly<top->next->size);i++)
				{
					if(J[j][i]==0)
					{
						li=j*8+i;
						wq->pr[ly]=li;
						wq->st[ly]='Y';
						ly++;
						J[j][i]=1;
					}
				}
		}
		else
		{
			fprintf(e,"\n 存储器中没有空闲块!\n");//把这些字符输出到文件指针e中
			fprintf(e,"文件 %c 必须等待!\n",top->next->name);//**文件必须等待
		}
	}
	else
	{
		fprintf(e,"\n ... 文件%c 已经加载到系统!...\n",top->next->name);//**文件已经加载
	}
	top->next=top->next->next;
	fprintf(e,"***********************此时,文件目录为:*********************\n");
                                                    //“这次文件指向的目录”输出到文件指针e中
	    fprintf(e,"                      名字     索引地址\n");
	for(x=0;x<N;x++)
		fprintf(e,"                       %c        %x\n",HEAD->names[x],HEAD->p[x]);
	for(x=0;x<N;x++)
	{
		fprintf(e,"   ===================文件 %c 的索引为:===============\n",HEAD->names[x]);
		fprintf(e,"                  逻辑编号  物理编号  标志态\n");
		for(y=0;y<HEAD->size[x];y++)
		  fprintf(e,"                     %d          %d       %c\n",HEAD->p[x]->lr[y],HEAD->p[x]->pr[y],HEAD->p[x]->st[y]);
	}
	fprintf(e,"   ----------------此时,文件位示图为:---------------\n");
	for(j=0;j<4;j++)
	{
		fprintf(e,"   ");
		for(i=0;i<8;i++)
			fprintf(e,"     %d",J[j][i]);
		fprintf(e,"\n");
	}
}


void main()
{
	int k;
	e=fopen("results.txt","w");//打开名为results.txt的文件,使用文件方式为“只写”,e指向results.txt文件
	for(j=0;j<4;j++)
		for(i=0;i<8;i++)
			J[j][i]=0;
	HEAD=(struct list *)malloc(sizeof(struct list));//申请内存空间
	for(i=0;i<32;i++)
	{
		HEAD->names[j]=' ';
		HEAD->size[i]=0;
		HEAD->p[i]=NULL;
	}
	printf("请输入作业个数:");
	scanf("%d",&jobs);
	scanf("%c",&bb);
	job=(struct que *)malloc(sizeof(struct que));
	job->name=' ';
	job->size=0;
	job->next=NULL;
	top=job;
	head=top;
	for(k=1;k<=jobs;k++)
	{
		job=(struct que *)malloc(sizeof(struct que));
		job->next=NULL;
		printf("文件 %d:\n",k);
		fprintf(e,"FILE %d:\n",k);
		printf("名字和大小:");
		scanf("%c,%d",&(job->name),&(job->size));
		scanf("%c",&bb);
        fprintf(e,"%c,%d\n",job->name,job->size);
		if(top->next==NULL)
		{
			top->next=job;
			head=job;
		}
		else
		{
			head->next=job;
			head=job;
		}
	}
	for(k=1;k<=jobs;k++)
		run();
	fclose(e);
	for(i=0;i<32;i++)
	{
		free(HEAD->p[i]);
		HEAD->p[i]=NULL;
	}
	free(HEAD);
	HEAD=NULL;
	while(top->next!=NULL)
	{
		struct que *tmp=top->next;
		top=top->next;
		free(tmp);
		tmp=NULL;
	}
	free(top);
	top=NULL;
}

⌨️ 快捷键说明

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