#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _QQData
...{
long uid;
char nickName[20];
}QQData;
#define C_CACHE_BLOCK 100 //保存100个内存块
#define C_CACHE_ENTRY 10 //每个内存块有10个item
bool iCacheInited = false;
char * pCacheShm = NULL;
//根据送进来的参数,抽取指定的位的数
int GetPartInt(int uid,int iBegin,int iEnd)
...{
char p[20];
char ret[20];
memset(p,0,20);
memset(ret,0,20);
sprintf(p,"%d",uid);
strncpy(ret,p+iBegin-1,iEnd);
return atoi(ret);
}
void InitCache()
...{
//用堆中的内存去模拟共享内存
pCacheShm = new char[sizeof(QQData) * C_CACHE_BLOCK *C_CACHE_ENTRY ];
if(pCacheShm != NULL)
...{
iCacheInited = true;
memset(pCacheShm,0,sizeof(QQData) * C_CACHE_BLOCK *C_CACHE_ENTRY);
}
}
void DetoryCache()
...{
delete[] pCacheShm;
}
//将一个QQ的结构体加入内存
void InsertCache(const QQData *data)
...{
int iBlockIndex,iEntryIndex,i;
QQData *pstEntry,*pstFirstEntry;
if(data->uid == 0 ||iCacheInited == false || strlen(data->nickName) == 0 )
return;
iBlockIndex = GetPartInt(data->uid,1,2);
if(iBlockIndex > C_CACHE_BLOCK)
...{
printf("key too large");
return;
}
pstEntry = (QQData *)(pCacheShm+sizeof(QQData)*C_CACHE_ENTRY*iBlockIndex);
pstFirstEntry = pstEntry;
for (i=0;i<C_CACHE_ENTRY;i++)
...{
if (pstEntry->uid==0) //找到第一个为空的Entry
...{
memcpy(pstEntry,data,sizeof(QQData));
return ;
}
else if ((pstEntry->uid == data->uid)
&& (strcmp(pstEntry->nickName,data->nickName) ==0))
...{
//不用添加
return ;
}
pstEntry++;
iEntryIndex++;
}
pstEntry=(QQData *)pstFirstEntry+iEntryIndex;
memcpy(&pstEntry,data,sizeof(QQData));
}
//从内存中读取该QQ结构体
void ReadFromCache(QQData *data)
...{
int iBlockIndex,iEntryIndex,i,iPhoneNo;
short iArea;
QQData *pstEntry;
if (!iCacheInited)
...{
return;
}
iBlockIndex = GetPartInt(data->uid,1,2);
if(iBlockIndex > C_CACHE_BLOCK)
...{
printf("key too large");
return;
}
pstEntry = (QQData *)(pCacheShm+sizeof(QQData)*C_CACHE_ENTRY*iBlockIndex);
for (i=0;i<C_CACHE_ENTRY;i++)
...{
if(pstEntry->uid == data->uid) 
...{
memcpy(data,pstEntry,sizeof(QQData));
return ;
}
pstEntry++;
}
return ;
}
void main()
...{
QQData *qqdata = new QQData;
qqdata->uid = 31611008;
memset(qqdata->nickName,0,sizeof(qqdata->nickName));
strcpy(qqdata->nickName,"maomao");
InitCache();
InsertCache(qqdata);
qqdata->uid = 31611009;
memset(qqdata->nickName,0,sizeof(qqdata->nickName));
strcpy(qqdata->nickName,"maomao1");
InsertCache(qqdata);
//根据QQ号码查询昵称
QQData *qqdata1 = new QQData;
qqdata1->uid = 31611008;
ReadFromCache(qqdata1);
printf("31611008 的昵称为:%s ",qqdata1->nickName);
qqdata1->uid = 31611009;
ReadFromCache(qqdata1);
printf("31611009的昵称为:%s ",qqdata1->nickName);
DetoryCache();
delete qqdata;
delete qqdata1;
}







