//Explode ini File
CuIniFile IniFile;
IniFile.OpenFile(szFilename);
string strURL = IniFile.GetValue("InternetShortcut", "URL");
// CuIniFile.h
class CuINIItem
{
public:
string m_Key;
string m_Value;
};
class CuINIStatment
{
public:
string m_Name;
vector<CuINIItem> m_vecItem;
};
// 有使用分號 ';' 的那一行, 會直接將整行試為註解, 不管分號是不是在第一個字元
class CuIniFile
{
vector<CuINIStatment> m_vecStatment;
public:
CuIniFile(void);
~CuIniFile(void);
public:
int OpenFile(LPCTSTR szFileName);
string GetValue( string strStatment, string strKey);
CuINIStatment *FindStatment( string strStatmentName );
CuINIItem *FindItem( CuINIStatment *pStatment, string strItemName );
private:
string GetStatment(string &str);
BOOL IsStatmentLine(string &str);
BOOL IsMemoLine(string &str);
void CreateNewStatment( string &str );
void CreateNewItem( string &str );
};
// CuIniFile.cpp
CuIniFile::CuIniFile(void)
{
}
CuIniFile::~CuIniFile(void)
{
}
int CuIniFile::OpenFile(LPCTSTR szFileName)
{
CuStringList StrList;
StrList.OpenFile(szFileName);
string strTemp;
for( int i = 0 ; i < StrList.size() ; i++ )
{
strTemp = StrList.at(i);
if( IsMemoLine(strTemp) )
continue;
if( IsStatmentLine(strTemp) )
CreateNewStatment(strTemp);
else
CreateNewItem(strTemp);
}
return 0;
}
CuINIStatment *CuIniFile::FindStatment( string strStatmentName )
{
vector<CuINIStatment>::iterator iter = m_vecStatment.begin();
for( ; iter < m_vecStatment.end(); iter++ )
{
if( (*iter).m_Name == strStatmentName )
return &(*iter);
}
return NULL;
}
CuINIItem *CuIniFile::FindItem( CuINIStatment *pStatment, string strItemName )
{
vector<CuIniFile> &IniItem = pStatment->m_vecItem;
vector<CuIniFile>::iterator iter = IniItem.begin();
for( ; iter < IniItem.end(); iter++ )
{
if( (*iter).m_Key == strItemName )
return &(*iter);
}
return NULL;
}
string CuIniFile::GetValue( string strStatment, string strKey)
{
CuINIStatment *pStatment = FindStatment(strStatment);
if( pStatment == NULL )
return "";
CuINIItem *pItem = FindItem(pStatment , strKey);
if( pItem == NULL )
return "";
return pItem->m_Value;
}
BOOL CuIniFile::IsMemoLine(string &str)
{
size_t found = str.find( ';' );
return ( found == 0 );
}
string CuIniFile::GetStatment(string &str)
{
size_t found_first = str.find( '[' );
size_t found_second = str.find( ']' , found_first);
string strStatment;
if( found_first != string::npos && found_second != string::npos )
strStatment = str.substr(found_first + 1, found_second - found_first - 1);
return strStatment;
}
BOOL CuIniFile::IsStatmentLine(string &str)
{
string strStatmentKey = GetStatment(str);
return (!strStatmentKey.empty());
}
void CuIniFile::CreateNewStatment( string &str )
{
CuINIStatment Statment;
Statment.m_Name = GetStatment(str);
m_vecStatment.push_back(Statment);
}
void CuIniFile::CreateNewItem( string &str )
{
size_t found = str.find('=');
if( found == string::npos )
return;
string strKey = str.substr(0, found);
string strValue = str.substr( found + 1 , str.size());
CuINIItem Item;
Item.m_Key = strKey;
Item.m_Value = strValue;
m_vecStatment[ m_vecStatment.size() - 1 ].m_vecItem.push_back(Item);
}
2009年12月17日 星期四
Explode ini File -- CuIniFile
訂閱:
張貼留言 (Atom)
註解支援不足, 不過現在主要是拿來剖 URL 捷徑, 不會有沒換行的註解, 後期要支援手動產生的ini file 在來擴充吧!
回覆刪除