savefile

来源:互联网 发布:大连民族学院网络 编辑:程序博客网 时间:2024/06/07 06:19
#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);}//写入vectorWriteMsgElementVec(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);}//读入vectorReadMsgElementVec(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;};

0 0
原创粉丝点击