使用memcpy()函式做回圈緩沖區的讀寫
首先對mencpy函式做個簡單的介紹
下面是 memcpy() 函式的宣告
void *memcpy(void *str1, const void *str2, size_t n)
引數
str1 -- 指向用于存盤復制內容的目標陣列,型別強制轉換為 void* 指標,
str2 -- 指向要復制的資料源,型別強制轉換為 void* 指標,
n -- 要被復制的位元組數,
該函式回傳一個指向目標存盤區 str1 的指標,
/*******************************
mencpy的常見用法有如下:
1. 復制字串
2. 復制字串中從某個位置開始的某些子連續字串
3. 覆寫字串的原有內容
******/
好了長話短說, 直接進入主題

具體實作代碼如下
1 #include <fstream> 2 #include <cstring> 3 #include "stdio.h" 4 #include "stdlib.h" 5 using namespace std; 6 7 8 #define DATA_RECV_BUFF_LEN 13 //緩沖區大小 9 #define DATA_SAVE_BUFF_LEN 2000 //保存區大小10 int recv_buff_write = 0; //緩沖區寫指標11 int mark = -1; //緩沖區資料溢位12 13 14 15 16 17 /* buf-->recv 把資料放入回圈緩沖區*/18 void recvbuf(char* buf, char* save_recv, int len)19 {20 //資料為空則回傳不做快取21 if (NULL == buf) return;22 23 /* data-->buf */24 //判斷快取區是否還有足夠的空間25 if (len < (DATA_RECV_BUFF_LEN - recv_buff_write))26 {27 28 memcpy(&save_recv[recv_buff_write], buf, len);29 recv_buff_write += len;30 31 32 }33 else34 { 35 memcpy(&save_recv[recv_buff_write], buf, (DATA_RECV_BUFF_LEN - recv_buff_write ));36 memcpy(&save_recv[0], &buf[(DATA_RECV_BUFF_LEN - recv_buff_write )], (len - (DATA_RECV_BUFF_LEN - recv_buff_write )));37 //寫指標重新計數38 recv_buff_write = (len - (DATA_RECV_BUFF_LEN - recv_buff_write));39 mark = 1;40 }41 }42 43 //讀取保存區資料資料44 void getrecv(char* recv_buff)45 {46 char data_buff[DATA_SAVE_BUFF_LEN] = { 0 }; //資料讀取47 /* buf-->data */48 //清空陣列49 memset(data_buff, 0, DATA_SAVE_BUFF_LEN);50 if (recv_buff_write >=0 and mark == -1)51 {52 memcpy(data_buff, &recv_buff[0], recv_buff_write);53 }54 else55 {56 57 memcpy(&data_buff[0], &recv_buff[recv_buff_write], DATA_RECV_BUFF_LEN - recv_buff_write );58 memcpy(&data_buff[DATA_RECV_BUFF_LEN - recv_buff_write ], &recv_buff[0], recv_buff_write );59 }60 printf("%s\n", data_buff);61 }62 63 int main()64 {65 char st1[10] ="abcd";66 char st2[10] = "abcd";67 char st3[10] = "abcd";68 char st4[10] = "efgh";69 char recv_buff[DATA_RECV_BUFF_LEN] = { 0 }; //緩沖區70 recvbuf(st1, recv_buff, strlen(st1));71 printf("%d\n", recv_buff_write);72 printf("%s\n", recv_buff);73 recvbuf(st2, recv_buff, strlen(st2));74 printf("%d\n", recv_buff_write);75 printf("%s\n", recv_buff);76 recvbuf(st3, recv_buff, strlen(st3));77 printf("%d\n", recv_buff_write);78 printf("%s\n", recv_buff);79 recvbuf(st4, recv_buff, strlen(st4));80 printf("%d\n", recv_buff_write);81 printf("%s\n", recv_buff);82 printf("讀取緩沖區的資料:\n");83 getrecv(recv_buff);84 printf("mark is %d\n", mark);85 return 0;86 }
運行結果如下

好了,本次分享到此結束,不喜勿噴
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/71553.html
標籤:C
下一篇:異或運算子的使用
