#include <stdio.h>
#include <string>
#include <vector>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
using namespace std;
typedef unsigned int MsgID;
class CLock
{
public:
CLock(pthread_mutex_t *pLock)
{
m_pLock = pLock;
if(m_pLock)
{
pthread_mutex_lock(m_pLock);
}
}
~CLock()
{
if(m_pLock)
{
pthread_mutex_unlock(m_pLock);
}
}
private:
pthread_mutex_t *m_pLock;
};
struct STMsgDefineInfo
{
struct STElement
{
unsigned int m_iType;
string m_strName;
string m_strChineseInstruction;
};
MsgID m_msgID;
unsigned short m_usMainCmd;
unsigned short m_usSubCmd;
vector<STElement> m_iRequestVec;
vector<STElement> m_iRespondVec;
string m_strServerName;
string m_strMod;
string m_strInstruction;
STMsgDefineInfo()
{
m_msgID = 0;
m_usMainCmd = 0;
m_usSubCmd = 0;
}
};
class CDataSavaFile
{
public:
static CDataSavaFile * Instance()
{
static CDataSavaFile *pDataSavaFile = NULL;
if(NULL == pDataSavaFile)
{
pDataSavaFile = new CDataSavaFile;
}
return pDataSavaFile;
}
int SaveToFile(string strFile, const vector<STMsgDefineInfo>& msgDefineInfoVec)
{
CLock lock(&m_lock);
//打开文件
int fd = open(strFile.c_str(), O_RDWR);
if(0 > fd)
{
return -1;
}
//写入消息数量
int iMsgCount = msgDefineInfoVec.size();
{
WriteInt(fd, (char*)&iMsgCount, sizeof(int));
}
for(int i = 0; iMsgCount > i; ++i)
{
const STMsgDefineInfo& stMsgDefineInfo = msgDefineInfoVec[i];
//写入消息id
{
WriteInt(fd, (char*)&stMsgDefineInfo.m_msgID, sizeof(stMsgDefineInfo.m_msgID));
}
//写入几个string
{
WriteString(fd, stMsgDefineInfo.m_strServerName);
WriteString(fd, stMsgDefineInfo.m_strMod);
WriteString(fd, stMsgDefineInfo.m_strInstruction);
}
//写入vector
WriteMsgElementVec(fd, stMsgDefineInfo.m_iRequestVec);
WriteMsgElementVec(fd, stMsgDefineInfo.m_iRespondVec);
}
close(fd);
return 0;
}
int GetDataFromFile(string strFile, vector<STMsgDefineInfo>& msgDefineInfoVec)
{
CLock lock(&m_lock);
//打开文件
int fd = open(strFile.c_str(), O_RDWR);
if(0 > fd)
{
return -1;
}
//读入消息数量
unsigned int iMsgCount = 0;
{
ReadInt(fd, iMsgCount);
}
for(int i = 0; iMsgCount > i; ++i)
{
STMsgDefineInfo stMsgDefineInfo;
//读入消息id
{
ReadInt(fd, stMsgDefineInfo.m_msgID);
stMsgDefineInfo.m_usMainCmd = (stMsgDefineInfo.m_msgID >> 16) & 0x00ff;
stMsgDefineInfo.m_usSubCmd = stMsgDefineInfo.m_msgID & 0x00ff;
}
//读入几个string
{
ReadString(fd, stMsgDefineInfo.m_strServerName);
ReadString(fd, stMsgDefineInfo.m_strMod);
ReadString(fd, stMsgDefineInfo.m_strInstruction);
}
//读入vector
ReadMsgElementVec(fd, stMsgDefineInfo.m_iRequestVec);
ReadMsgElementVec(fd, stMsgDefineInfo.m_iRespondVec);
msgDefineInfoVec.push_back(stMsgDefineInfo);
}
close(fd);
return 0;
}
protected:
void WriteInt(int fd, const char *pBuf, size_t count)
{
write(fd, pBuf, count);
}
void WriteString(int fd, const string& strValue)
{
//写长度
int iCount = strValue.length();
WriteInt(fd, (char*)&iCount, sizeof(int));
//写内容
WriteInt(fd, strValue.c_str(), iCount);
}
void WriteMsgElementVec(int fd, const vector<STMsgDefineInfo::STElement>& elementVec)
{
//写数量
int iElementCount = elementVec.size();
WriteInt(fd, (const char *)&iElementCount, sizeof(int));
//写内容
for(int i = 0; iElementCount > i; ++i)
{
const STMsgDefineInfo::STElement& stElement = elementVec[i];
WriteInt(fd, (char*)&stElement.m_iType, sizeof(int));
WriteString(fd, stElement.m_strName);
WriteString(fd, stElement.m_strChineseInstruction);
}
}
void ReadInt(int fd, unsigned int& value)
{
read(fd, (void*)&value, sizeof(int));
}
void ReadString(int fd, string& strValue)
{
unsigned int value = 0;
read(fd, (void*)&value, sizeof(int));
char buf[value];
read(fd, buf, value);
strValue.assign(buf, value);
}
void ReadMsgElementVec(int fd, vector<STMsgDefineInfo::STElement>& elementVec)
{
//写数量
unsigned int iElementCount = 0;
ReadInt(fd, iElementCount);
//写内容
for(int i = 0; iElementCount > i; ++i)
{
STMsgDefineInfo::STElement stElement;
ReadInt(fd, stElement.m_iType);
ReadString(fd, stElement.m_strName);
ReadString(fd, stElement.m_strChineseInstruction);
elementVec.push_back(stElement);
}
}
private:
CDataSavaFile()
{
//m_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_init(&m_lock, NULL);
}
private:
pthread_mutex_t m_lock;
};
savefile
最新推荐文章于 2020-09-27 16:33:29 发布