C++ INI檔案
INI檔案多用於儲存程式的初始化資訊。例如,記錄程式串連資料庫的名稱、上一次使用者登入的名稱、使用者的註冊資訊等。
一. INI 檔案格式
[Section1 Name]KeyName1=value1KeyName2=value2...... ......[Section2 Name]KeyName1=value1KeyName2=value2
Section:節名;KeyName:鍵名;value:索引值。對於一個INI檔案,可以有多個節,每個節可以包含多個鍵。
二.讀寫INI檔案
1. GetPrivateProfileInt - 從INI檔案的指定Section 指定key 的整數值
GetPrivateProfileInt(LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址LPCTSTR lpKeyName, // 指向包含 Key 名稱的字串地址INT nDefault // 如果 Key 值沒有找到,則返回預設的值是多少LPCTSTR lpFileName // ini 檔案的檔案名稱);
2. GetPrivateProfileString - 從INI檔案的指定Section 指定key 的串值
GetPrivateProfileString(LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址LPCTSTR lpKeyName, // 指向包含 Key 名稱的字串地址LPCTSTR lpDefault, // 如果 Key 值沒有找到,則返回預設的字串的地址LPTSTR lpReturnedString, // 返回字串的緩衝區地址DWORD nSize // 緩衝區的長度LPCTSTR lpFileName // ini 檔案的檔案名稱);
3. GetPrivateProfileSection - 從INI檔案中讀出指定Section 的內容
GetPrivateProfileSection(LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址LPTSTR lpReturnedString, // 返回資料的緩衝區地址DWORD nSize // 返回資料的緩衝區長度LPCTSTR lpFileName // ini 檔案的檔案名稱);
4. GetPrivateProfileSectionNames - 從INI檔案中獲得所有Section資訊
GetPrivateProfileSectionNames(LPTSTR lpszReturnBuffer, // 返回資料的緩衝區地址DWORD nSize // 返回資料的緩衝區長度LPCTSTR lpFileName // ini 檔案的檔案名稱);
5. WritePrivateProfileSection - 將整個Section 的內容寫入INI檔案的指定Section中
WritePrivateProfileSection(LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址LPCTSTR lpString // 要寫入的資料的地址LPCTSTR lpFileName // ini 檔案的檔案名稱);
6. WritePrivateProfileString - 將指定Key的串值寫入INI檔案的指定Section中
WritePrivateProfileString(LPCTSTR lpAppName, // 指向包含 Section 名稱的字串地址LPCTSTR lpKeyName, // 指向包含 Key 名稱的字串地址LPCTSTR lpString // 要寫的字串地址LPCTSTR lpFileName // ini 檔案的檔案名稱);
三.應用
在我們實際使用的時候,用的最多的是GetPrivateProfileString和WritePrivateProfileString,但在對自訂INI檔案操作的時候要注意的是,如果lpFileName指定的檔案不包含路徑資訊,API將預設為Windows 的安裝目錄而不是系統當前路徑,比較方便的方法是使用.\ xxx.ini 作為檔案名稱指示API操作對象為當前路徑下的xxx.ini檔案。
(1)儲存
void CRemoteMgrDlg::OnSave() { // TODO: Add your control notification handler code here CString IP_Save; char inBuf[256]; char path[255] ; m_CtrlIP.GetWindowText(IP_Save); if(strcmp(IP_Save,m_IPData)!=0) //IP地址有改變 { GetCurrentDirectory(256,inBuf); sprintf(path,"%s\\data.ini",inBuf); //設定ini檔案的全路徑 WritePrivateProfileString("資訊","IP地址",IP_Save,path); strcpy(m_IPData,IP_Save); MessageBox("儲存成功!","提示"); } }
(2)讀取載入
CString CRemoteMgrDlg::Data_Loading() { char path[255] ; char inBuf[256]; CString IP_Save; GetCurrentDirectory(256,inBuf); sprintf(path,"%s\\data.ini",inBuf); //設定ini檔案的全路徑 GetPrivateProfileString("資訊","IP地址","",IP_Save.GetBuffer(255),255,path); //讀取資料 m_CtrlIP.SetWindowText(IP_Save); m_CtrlPort.SetWindowText("8888"); strcpy(m_IPData,IP_Save); return IP_Save;}
(3)刪除節名下的內容
如果儲存的資料比較多,並且每次儲存的資料個數不定,可能會要求刪除這個節名的內容,然後再進行資料的儲存。
BOOL CRemoteMgrDlg::DelSection(LPCTSTR lpSection) { char inBuf[256]; char path[255] ; GetCurrentDirectory(256,inBuf); sprintf(path,"%s\\data.ini",inBuf); if(WritePrivateProfileString(lpSection,NULL,NULL,path)) return FALSE; else return GetLastError(); }
(4)具有相同性質的數組類資料寫入
可以先寫入這個數組的長度,然後for迴圈寫入數組的內容
BOOL CIniFile::Write(LPCSTR AppName, LPCSTR KeyName, LONG RowIndex, LPCSTR lpString){ CHAR MKeyName[64]; sprintf(MKeyName,"%s_%ld",KeyName,RowIndex); return Write(AppName,MKeyName,lpString);}BOOL CIniFile::Write(LPCSTR AppName, LPCSTR KeyName, LPCSTR lpString){ return WritePrivateProfileString(AppName, KeyName, lpString,m_FileName);}
(4)具有相同性質的數組類資料讀取
可以先讀出這個數組的長度,然後for迴圈讀出數組的內容
DWORD CIniFile::Read(LPCSTR AppName, LPCSTR KeyName, LONG RowIndex, LPCSTR lpDefault, LPSTR ReturnedString, DWORD nSize){ CHAR MKeyName[64]; sprintf(MKeyName,"%s_%ld",KeyName,RowIndex); return Read(AppName,MKeyName,lpDefault,ReturnedString,nSize);}DWORD CIniFile::Read(LPCSTR AppName, LPCSTR KeyName, LPCSTR lpDefault, LPSTR ReturnedString, DWORD nSize){ return GetPrivateProfileString(AppName,KeyName,lpDefault,ReturnedString,nSize,m_FileName); }
當然,對於資料的讀寫,也可以用普通檔案的方式來完成。