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

📄 function.cpp

📁 模拟DOS下FAT表的构造
💻 CPP
字号:
#include"file.h"

extern fileinfo file[FILENUM];
extern int filenum;
extern int FAT[DISC],blankspace;


void write(char *tmpname,int tmplen)
//功能:写新文件
//参数说明:
//tmpname-要写入的文件名,tmplen-要写入的文件长度
{
	int last;
	//复制文件名和文件块个数
	strcpy(file[filenum].filename,tmpname);
	file[filenum].filelen=tmplen;
	//存文件
	for(int i=2;i<DISC;i++)
	{
		if(FAT[i]==0)
		{
			last=file[filenum].filestart=i;//首个空闲块为文件开始块
			break;
		}
	}
	for(i=1;i<=tmplen;i++)
	{	//last为上个记录的位置
		for(int j=last+1;j<DISC;j++)
			if(FAT[j]==0)
			{
				FAT[last]=j;
				last=j;
				break;
			}
	}
	FAT[last]=FFF;//文件末存结束标记
	blankspace-=tmplen;//改变空闲块个数
	cout<<endl<<"FILE "<<filenum++<<endl;
	cout<<"name and size :"<<tmpname<<"  "<<tmplen<<endl;
}


void cover(char *tmpname,int tmplen)
//功能:覆盖写文件
//参数说明:
//tmpname-要覆盖的文件名,tmplen-要写入的文件长度
{
	int last,end;
	//寻找要覆盖的文件,将其数组下标存入last
	for(int i=0;i<filenum;i++)
	{
		if(strcmp(file[i].filename,tmpname)==0)		last=i;
		break;
	}
	//若要写入文件长度小于原文件长度
	if(file[last].filelen>tmplen)
	{	//寻找结束位
		for(int i=0;i<tmplen;i++)
			end=FAT[i];
		//逐位置零
		for(i=FAT[end],FAT[end]=FFF;FAT[i]!=FFF;)
		{
			end=i;
			i=FAT[end];
			FAT[end]=0;
		}
		FAT[end]=0,FAT[i]=0;
	}
	//若要写入文件长度大于原文件长度
	else if(file[last].filelen<tmplen)
	{	
		//写入前判断是否有足够空间
		if(tmplen>blankspace-file[last].filelen)
		{
			cout<<"not enough space!"<<endl;
			return;
		}
		//寻找原结束标记,存入end
		for(int end=file[last].filestart;FAT[end]!=FFF;end=FAT[end]);
		//从结束位开始,寻找空闲块存入文件
		for(int i=0;i<tmplen-file[last].filelen;i++)
			for(int j=0;j<DISC;j++)
				if(FAT[j]==0)//块空闲则插入	
				{
					FAT[end]=j;
					end=j;
				}
		FAT[end]=FFF;
	}
	//改变空闲块个数与文件长度
	blankspace-=file[last].filelen-tmplen;
	file[last].filelen=tmplen;
	cout<<endl<<"FILE "<<(filenum-1)<<endl;
	cout<<"name and size :"<<tmpname<<"  "<<tmplen<<endl;
}



void insert(char *tmpname,int insertpoint)
//功能:在文件指定位置插入一个块
//参数说明:
//tmpname-要执行插入操作的文件名,insertpoint要插入块的位置
{
	int last,brpoint;
	//寻找要执行插入操作的文件,将其数组下标存入last
	for(int i=0;i<filenum;i++)
		if(strcmp(file[i].filename,tmpname)==0)	
		{
			last=i;
			break;
		}

	if(insertpoint>=file[last].filelen)
	{
		cout<<"插入点溢出"<<endl;
		return;
	}
	
	//brpoint记录当前文件扫描到的位置
	brpoint=file[last].filestart;
	for(i=0;i<insertpoint-1;i++)
		brpoint=FAT[brpoint];//扫描直到找到插入位置
	//寻找一个空闲块插入
	for(i=0;i<DISC;i++)
		if(FAT[i]==0)
		{
			FAT[i]=FAT[brpoint];
			FAT[brpoint]=i;
			break;
		}
	//改变空闲块个数与文件长度
	file[last].filelen++;
	blankspace--;		cout<<endl<<"FILE "<<(filenum-1)<<endl;
	cout<<"name and size :"<<tmpname<<"  "<<file[last].filelen<<endl;
}

⌨️ 快捷键说明

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