savefile

#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;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值