#pragma once #ifndef AFX_EXT_CLASS #define AFX_EXT_CLASS Q_DECL_IMPORT #endif //#include "SplitPath.h" namespace GBase { //为了自动释放申请的内存 class AFX_EXT_CLASS CStringBuffer { public: CStringBuffer(LPCTSTR strData = NULL); virtual ~CStringBuffer(); void SetData(CString strData); //初始化设置数据串 void AddData(CString strData); //继续增加数据串 void AddData(char cAdd, int nCount); //增加指定的字符到数据串中,为了扩展'\0'增加 void AddData(char* pAdd, int nNum); //增加指定的字符串到数据中 void Attach(char* pBuffer, int nLength); char* Detach(void); //返回数据指针,将内部置空,返加的指针需要使用delete删除 void Clear(); char* GetData() { return m_pData; } int GetLength() { return m_nNum; } operator char* (void) const { return m_pData; } char& operator[](int idx) { return m_pData[idx]; } char operator[](int idx) const { return m_pData[idx]; } //获得以回车结束的一行文本,返回下一行的开始 int GetNextLine(CString& strLine, int nBeginIndex = 0); CString Mid(int nBegin, int nCount = -1); int Create(int nNum); int AppendCreate(int nAddNum); private: int m_nNum; char* m_pData; }; //操作CFile类 class AFX_EXT_CLASS IOFile { public: IOFile(CFile* pFile = NULL, BOOL bDelete = FALSE); virtual ~IOFile(void); BOOL GetStatus(CFileStatus& rStatus) const; virtual CString GetFileName() const; virtual CString GetFileTitle() const; virtual CString GetFilePath() const; virtual void SetFilePath(LPCTSTR lpszNewName); virtual void Close(void); #ifndef _QT_VERSION virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL); virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CAtlTransactionManager* pTM, CFileException* pError); #else virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags); #endif //_QT_VERSION virtual UINT Read(void* lpBuf, UINT nCount); virtual void Write(const void* lpBuf, UINT nCount); virtual void SeekToBegin(); virtual ULONGLONG SeekToEnd(); virtual ULONGLONG Seek(LONGLONG lOff, UINT nFrom); virtual ULONGLONG GetPosition(); virtual ULONGLONG GetLength(); virtual void SetLength(ULONGLONG dwNewLen); //设置、获取文件指针 //virtual void SetFile(CFile* pFile) { m_pFile=pFile; } virtual CFile* GetFile() { return m_pFile; } public: //ASCII码文件的读写 int ReadString(CString& str); int GetString(CString& str); int ReadString(char* str, int nMaxLength); //读取一行字符串 int GetString(char* str, int nMaxLength); //读取一段字符串(以空格或回车为终止符) int ReadLine() { return ReadString(); } //读取一行字符串到临时数组中(任意长度,内部自动扩展缓存) int ReadString(); //读取一行字符串到临时数组中(任意长度,内部自动扩展缓存) int GetString(); //读取一段字符串(以空格或回车为终止符)到临时数组中 char* GetTempString(void); //获得临时数组 int GetTempStringLength(void); //获得临时数组长度 void ZeroTempString(void); //清空临时数组 CStringBuffer& GetTempBuffer() { return m_tempBuffer; } void WriteChar(LPCTSTR lpstr, int nTimes = 1); //写入nTimes次字符串进文件 void WriteLine(LPCTSTR lpstr, int nTabNum); //进行nTabNum次tab操作,再写一行字符串 void WriteLine(CString str); //写一行数据(包括回车),是WriteString与WriteReturn的组合 void WriteString(CString str, int nTabNum = 0); //写一串数据 void WriteString(double value, int n = 6); //写一个双精度数据 void WriteString(long value); //写一个长整形数据 void WriteReturn(); //写一个回车 void WriteXY(double x, double y, char cSplit = ','); //写X,Y数据 int ReadXY(double& x, double& y, char cSplit = ','); void WriteXY(double x, double y, double z, char cSplit = ','); int ReadXY(double& x, double& y, double& z, char cSplit = ','); void WriteArray(int num, double* pValue, char cSplit = ' '); //输出数组到字符串中,用户可以自定义间隔符号(缺省是‘,’) void PrintXYZ(char* string, double *v, int num, int digits, char split = ','); void PrintXYZ(CString& result, double *v, int num, int digits, char split = ','); void PrintXYZ(char* result, double *v, int num, char split = ','); void PrintXYZ(CString& result, double *v, int num, char split = ','); //快速保存指定内容 BOOL WriteFile(LPCTSTR lpSaveFileName, void* pBuffer, DWORD nBufferSize); //二进制dfb文件读写 void SerializeString(CArchive& ar, CString& str, const short& ver); void WriteElementType(CArchive& ar, int nType, const short& ver); //写元素类型(int 或 short)型 void ReadElementType(CArchive& ar, int &nType, const short& ver); //读元素类型(int 或 short)型 ////读写二进制内存块 //int DFD_WriteMemoryBlock(CDFile& fw, BYTE* lpData, DWORD nDataLength, LPCTSTR strType); //BYTE* DFD_ReadMemoryBlock(CDFile& fr, DWORD& nOutDataLength, CString& strType); ////xml格式写 //void WriteDML(CRect8& rect,int nTabNum, CString key=_T("")); //void WriteDML_Head_Version(); //void WriteDML_Head_Xmlns(); //void WriteDML_Head_MapType(int nTabNum, CString strMapType); //void WriteDML_Tail_MapType(int nTabNum, CString strMapType); //void WriteDML_Tail(short ver); //void WritePCG(const CRect8& rect,int nTabNum, CString key=_T("")); //void WritePCG_Head_Version(); //void WritePCG_Head_Xmlns(); //void WritePCG_Head_MapType(int nTabNum, CString strMapType); //void WritePCG_Tail_MapType(int nTabNum, CString strMapType); //void WritePCG_Tail(short ver); //编码 void ConvertGBKToUTF8(CString& strGBK, bool checkCodec = true); void SetCodeType(DWORD nType); DWORD GetCodeType(); //xml格式版本号 void SetXmlVersion(double dVer); double GetXmlVersion(); //获得设置临时错误信息 void SetErrorInfo(LPCTSTR lpszErrorInfo); CString GetErrorInfo(void); enum ECodeType { codeGB2312 = 0x00000000, //gb2312编码,与CODE_GB2312相同 codeUTF8 = 0x00000001 //utf-8编码,与CODE_UTF8相同 }; protected: CFile* m_pFile; BOOL m_bDelete; //是否删除m_pFile double m_dXmlVersion; //版本号 DWORD m_nCodeType; //编码类型 CString m_strErrorInfo; //临时保存的错误信息 //为了适应任意长度的一行文本,改为变长串 CStringBuffer m_tempBuffer; //每行文件内容, 初始化为2048个 }; }; using namespace GBase;