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

📄 bufferqueue.h

📁 为编译原理课程设计
💻 H
字号:
#define BUFFERSIZE 100

typedef struct
{
		char data[BUFFERSIZE];
		int front,rear;
}BUFFERQUEUE;

BUFFERQUEUE bufferqueue;

int empty(BUFFERQUEUE *bq)
{
	if(bq->rear==bq->front)
		return 1;
	else
		return 0;
}

char getfront(BUFFERQUEUE *bq)
{
	char v;
	if(empty(bq))
	{
		//EMPTY
		v=NULL;
	}
	else
		v=bq->data[(bq->front+1)%BUFFERSIZE];
	return v;
}

int enqueue(BUFFERQUEUE *bq,char x)		//入队
{
	int r;
	if(bq->front==(bq->rear+1)%BUFFERSIZE)
	{
		//FULL
		//当缓冲队列满时,最后一个从文件读入的字符并没有放入缓冲队列中,因此需要将文件指针后退一个字符
		r=0;
	}
	else
	{
		bq->rear=(bq->rear+1)%BUFFERSIZE;
		(bq->data)[bq->rear]=x;
		r=1;
	}
	return r;
}

char dequeue(BUFFERQUEUE *bq)			//出队
{
	char v;
	if(empty(bq))
	{
		//EMPTY;
		//当缓冲队列空时,应调用读取文件内容至缓冲区的函数
		v=NULL;
	}
	else
	{
		bq->front=(bq->front+1)%BUFFERSIZE;
		v=(bq->data)[bq->front];
	}
	return v;
}






void LoadFileToBuffer(FILE *fp)	//加载文件内容至缓冲队列
{
	char readchar;
	int eof_f;
	eof_f=feof(fp);
	while(eof_f!=16)
	{
		fread(&readchar,sizeof(char),1,fp);
		if(enqueue(&bufferqueue,readchar)==0)
		{
			fseek(fp,-1,1);		//回退一个字符
			break;
		}
		eof_f=feof(fp);

		//发现每次文件结尾处的缓冲队列总是多读入一个相同的字符
		if(eof_f==16)
		{
			if(bufferqueue.rear!=0)
				bufferqueue.rear-=1;
			else
				bufferqueue.rear=BUFFERSIZE-1;
		}
	}

	
	
}
char ReadBuffer(FILE *fp)	//取缓冲队列中的一个字符
{
	if(empty(&bufferqueue))
	{
		LoadFileToBuffer(fp);
	}
	
	return dequeue(&bufferqueue);
}

void backfront(BUFFERQUEUE *bq)		//回退操作
{
	//if(empty(&bufferqueue)!=1)
	//{
		if(bq->front!=0)
			bq->front-=1;
		else
			bq->front=BUFFERSIZE-1;
	//}
}
int BufferEmpty()
{
	return empty(&bufferqueue);
}

⌨️ 快捷键说明

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