循环队列读文本输出到屏幕

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


#define BUF_SIZE	4096*500
typedef  unsigned char uint8_t;

typedef struct _new_queue {
    uint8_t * buf;
	int bufsize;
	int write_ptr;
	int read_ptr;

} NewQueue;

/*NewQueue是一个循环队列buf长度为BUF_SIZED读写都是从0开始当读写到达最大长度就除以BUF_SIZED取余数从新开始*/

NewQueue recvqueue;


void init_queue(NewQueue *que, int size) {
	
	que->buf = (uint8_t*)malloc(sizeof(uint8_t)*size);
	que->read_ptr = que->write_ptr = 0;
	que->bufsize = size;
//	fprintf(stdout, "que->bufsize=%d\n", size);
}

void put_queue(NewQueue*que, uint8_t* buf, int size) {
	uint8_t* dst = que->buf + que->write_ptr;



	if ((que->write_ptr + size) > que->bufsize) {
		memcpy(dst, buf, (que->bufsize - que->write_ptr));
		memcpy(que->buf, buf+(que->bufsize - que->write_ptr), size-(que->bufsize - que->write_ptr));
	} else {
		memcpy(dst, buf, size*sizeof(uint8_t));
	}
	que->write_ptr = (que->write_ptr + size) % que->bufsize;


}

int get_queue(NewQueue*que, uint8_t* buf, int size) {
	uint8_t* src = que->buf + que->read_ptr;
	int wrap = 0;



	int pos = que->write_ptr;

	if (pos < que->read_ptr) {
		pos += que->bufsize;
		wrap = 1;
	}

	if ( (que->read_ptr + size) > pos) {

		return 1;

	}

	if (wrap) {
		fprintf(stdout, "wrap...\n");
		memcpy(buf, src, (que->bufsize - que->read_ptr));
		memcpy(buf+(que->bufsize - que->read_ptr), src+(que->bufsize - que->read_ptr), size-(que->bufsize - que->read_ptr));
	} else {
		memcpy(buf, src, sizeof(uint8_t)*size);
	}
	que->read_ptr = (que->read_ptr + size) % que->bufsize;


	return 0;
}

int main ()
{
	const char fileName[] = "./ffserver.conf";
	char buf[1024];
	int index = 0;
	init_queue(&recvqueue, BUF_SIZE);
	FILE* f = fopen(fileName,"r");
	if(!f)
		return -1;
	for(;;){
		
		if (fgets(buf, 1024, f) == NULL) {
			break;
		}
		index++;
		put_queue(&recvqueue, (uint8_t*)buf,strlen(buf) );
		memset(buf, 0, sizeof(buf));
		//if(index%2==0)
		get_queue(&recvqueue, (uint8_t*)buf, 1024 );
		fprintf(stdout,"%s",buf);

	}

	getchar();
	return 0;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值