📄 inifile.h
字号:
// IniFile.h: interface for the CIniFile class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_INIFILE_H__16C92A6A_E0DC_4BD6_A9B5_1FCD6112ED1C__INCLUDED_)
#define AFX_INIFILE_H__16C92A6A_E0DC_4BD6_A9B5_1FCD6112ED1C__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "vector"
const int BUFFLINE=512;
extern class CIniFile m_iniFile;//声明外部对象,给其他类文件中调用
class CIniFile
{
protected:
struct Key
{
WCHAR strLine[BUFFLINE]; //名称
WCHAR strVal[BUFFLINE]; //内容
bool bValid; //是否有效
Key()
{
bValid=false;
memset(strLine,0,BUFFLINE*sizeof(WCHAR));
memset(strVal,0,BUFFLINE*sizeof(WCHAR));
}
void SetVal(WCHAR *sVal)
{
TrimLeft(sVal,_T(''));
TrimRight(sVal,_T(''));
wcscpy(strVal,sVal);
int s1=0,s2=0;
s1=Find(strLine,_T("="),1);
s2=Find(strLine,_T(";"),1);
if(s2>0)
{
wsprintf(sVal,_T("%s%s"),sVal,strLine+s2);
}
wcscpy(strLine+s1+1,sVal);
}
};
struct Section
{
WCHAR strLine[BUFFLINE]; //名称
std::vector<Key*> arKey;
HANDLE m_hHeap;//
bool bValid;//是否有效
Section(HANDLE hHeap)
{
bValid=false;
m_hHeap=hHeap;
memset(strLine,0,BUFFLINE*sizeof(WCHAR));
arKey.clear();
}
Section()
{
bValid=false;
memset(strLine,0,BUFFLINE*sizeof(WCHAR));
arKey.clear();
}
~Section()
{
int i=0;
for(i=0;i<arKey.size();i++)
{
Key *pKey=arKey[i];
if(pKey)
HeapFree(m_hHeap,HEAP_NO_SERIALIZE,pKey);
}
}
Key* AddKey(WCHAR *sLine)
{
int nLen=sizeof(Key);
Key *pKey=(Key*)HeapAlloc( m_hHeap, HEAP_ZERO_MEMORY, sizeof(Key));
if(pKey)
{
wcscpy(pKey->strLine,sLine);
arKey.push_back(pKey);
}
else
return NULL;
int nPos=CIniFile::Find(sLine,_T("="),1);
if (sLine[0] == _T('\n') || sLine[0] == _T(';') || nPos<0)//注释或空行
{
pKey->bValid=false;
}
else
{
//解析值
pKey->bValid=true;
int p1=CIniFile::Find(sLine,_T(";"),1);
if(p1<0)
wcscpy(pKey->strVal,sLine+nPos+1);
else if(p1>nPos)
{
wcsncpy(pKey->strVal,sLine+nPos+1,p1-nPos);
}
else
{
pKey->bValid=false; //=号被注释
}
}
return pKey;
}
};
friend struct Section;
friend struct Key;
public:
CIniFile();
virtual ~CIniFile();
void GetPath(WCHAR *strPath);
bool LoadIniFile(WCHAR *strName);
bool WriteKeyString(WCHAR * strSection, WCHAR * strKey, WCHAR * strValue);
bool GetKeyString(WCHAR * strSection ,WCHAR * strKey,WCHAR * strDefault,WCHAR *strResult);
//protected:
void SaveIniFile();
void RemoveAll();
Section *FindSection(WCHAR *strSection);
Key *FindKey(Section *pSection,WCHAR *strKey);
static int Find( WCHAR *string, WCHAR *strCharSet,int nStart );
static void Mid(WCHAR* string,int nStart,int nLength,WCHAR *strDesc);
static void TrimRight(WCHAR *string ,int c);
static void TrimLeft(WCHAR *string ,int c);
static int CompareNoCase(WCHAR *string1,WCHAR *string2);
static void StringToUpper(WCHAR *string);
static void Replace(WCHAR *string,WCHAR* strFind,WCHAR* strCharSet);
static int ReverseFind(WCHAR* string,WCHAR* strFind);
protected:
CRITICAL_SECTION m_hCS;
HANDLE hHeap;//
std::vector<Section*> m_arSection;
WCHAR m_strFile[256];//INI文件名
WCHAR m_strPath[256];
};
#endif // !defined(AFX_INIFILE_H__16C92A6A_E0DC_4BD6_A9B5_1FCD6112ED1C__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -