
Environment: VC6 SP4, NT4 SP6,W98 SE, W2000 SP1
You know it takes lots of code lines when you use the API for storing data into an Ini-File. E.g. for just one double it would look like this:
// store
CString strTemp;
strTemp.Format("%g",m_dDouble);
WritePrivateProfileString("MySection",
"MyDouble",
strTemp,
"C:\\MyPath\\MyIni.ini");
// load
char pBuffer[256];
GetPrivateProfileString("MySection",
"MyDouble",
"1.23",
pBuffer,
256,
"C:\\MyPath\\MyIni.ini");
m_dDouble = atof(pBuffer);
With this CIni class, I tried to reduce the coding to a minimum. I usually use one function for reading and writing. (E.g. For these members of CMyClass)
int m_nMember;
double m_dMember;
CString m_strMember;
CPoint m_arPoints[2];
The code for the ini file IO could be reduced to this:
void CMyClass::UpdateFromIni( bGet /*=TRUE*/ )
{
CIni ini("C:\\MyPath\\MyIni.ini", "MySection" );
ini.SER_GET( bGet, m_nMember );
ini.SER_GETD( bGet, m_dMember, 1.23 );
ini.SER_GET( bGet, m_strMember );
ini.SER_ARR( bGet, m_arPoints, 2 );
}
The output will look like this:
[MySection]
m_nMember=0
m_nMember=1.23
m_strMember=
m_arPoints_0=(0,0)
m_arPoints_1=(0,0)
It supports overloaded functions for these standard types:
- CString
- short
- int
- WORD
- DWORD
- CPoint
- CRect
- float
- double
and arrays of them:
- CString*
- short*
- int*
- WORD*
- DWORD*
- CPoint*
- CRect*
- float*
- double*
Each function has the following parameters:
void CIni::SerGet(
BOOL bGet, // TRUE: Load from Ini,
// FALSE: Save to Ini
LPCSTR szEntry, // The Entry
TYPE& type // The type from the list above
//int nCount // only the array versions:
// count of array elements to load/save
LPCSTR szSection=NULL // An other value than NULL will effect
// all following entries
TYPE default=0); // 0 for numeric Types, "" for Strings
And to avoid coding the entry twice, there are 4 macros:
#define SER_GET(bGet,value) SerGet(bGet,value,#value)
#define SER_ARR(bGet,value,n) SerGet(bGet,value,n,#value)
#define SER_GETD(bGet,value) SerGet(bGet,value,#value,
NULL,default)
#define SER_ARRD(bGet,value,n) SerGet(bGet,value,n,#value,
NULL,default)
So my function typicaly contains a combination of this.
void CMyClass::UpdateFromIni( bGet /*=TRUE*/ )
{
CIni ini( "" , "MyFirstSection" );//Default file name
ini.SER_GETD( bGet, m_nMember, 42);
ini.SER_GET( bGet, m_dMember );
ini.SetSection("MyOtherSection");
ini.SER_GET( bGet, m_strMeber );
ini.SER_GETD( bGet, m_strOther, "Hello" );
ini.SER_ARR( bGet, m_arPoints, 2 );
}
Using just a filename without a path, normaly causes the OS to store the Ini-file in the Windows directory.
To avoid this, the modul path will be insert in front of the filename by default.
Downloads
Download demo project – 17 Kb
Download source – 5 Kb
The latest versions may be found at:
www.schikos.de