#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;
}
循环队列读文本输出到屏幕
最新推荐文章于 2022-05-16 20:52:43 发布