www.pudn.com > WordParser.rar > BufferQueue.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); 
}