C++讀取INI文件

Windows操做系統專門爲此提供了6個API函數來對配置設置文件進行讀、寫:
GetPrivateProfileInt() 從私有初始化文件獲取整型數值 GetPrivateProfileString() 從私有初始化文件獲取字符串型值 GetProfileInt 從win.ini 獲取整數值 GetProfileString 從win.ini 獲取字符串值 WritePrivateProfileString 寫字符串到私有初始化文件 WriteProfileString 寫字符串到win.ini
咱們能夠把視圖類的:OnInitialUpdate() 函數做爲程序啓動時讀取配置文件的入口,配置文件的存儲格式以下:
[SECTION 1] XPos=300 YPos=200
[SECTION 2] Text=Hello
僅有兩個節,XPos和YPos標明瞭待顯示信息的座標,而待顯示的信息存儲在第二節的Text項中,用讀取訪問私有配置設置文件的API函數將其分別讀入到變量m_nXPos,m_nYPos和m_strText中,並經過Invalidate()調用OnDraw()函數,在其內用TextOut函數將該信息在讀取的座標位置顯示出來:
m_nXPos=GetPrivateProfileInt("SECTION 1", //節名 "XPos", //項名 0, //沒找到此項時的缺省返回值 "C:\test\debug\test.ini"); //配置文件的準確路徑
m_nYPos=GetPrivateProfileInt("SECTION 1","YPos",0,exeFullPath); char buf[256]; len=GetPrivateProfileString("SECTION 2", //節名 "Text", //項名 "No Text", //沒找到此項時的返回值 buf, //目標緩衝區地址 256, //目標緩衝區長度 "C:\test\debug\test.ini"); //配置文件的準確路徑
for(int i=0;i<len;i++) {    CString str;    str.Format("%c",buf[i]);    m_strText+=str; } Invalidate();
通常配置文件是和應用程序存放在同一個目錄中的若是用"C:\test\debug\test.ini"的絕對路徑進行設置就會出現路徑改變後找不到配置文件的問題,因此應動態搜尋配置文件的存放地址:
Tchar exeFullPath[MAX_PATH]; // MAX_PATH在API中有定義,爲128 int len=GetModuleFileName(NULL, exeFullPath, //應用程序的全路徑存放地址 MAX_PATH); CString path="\test.ini"; //配置文件名 ::strcpy(exeFullPath+len-13,path); //組合出配置文件的全路徑
值得注意的是這裏的13是項目名的大小,可是不一樣項目可能名字不同,定義這樣的長度過於機械化windows

1     char * p = NULL; 2     char exeFullPath[ 128 ]; 3     int len = GetModuleFileName(NULL, 4         exeFullPath,                128 ); 5     p = strrchr(exeFullPath, ' \\ ' );   6     * p = ' \0 ' ;

這樣,經過strrchr函數屏蔽掉最後出現的'\'就可以把項目名也屏蔽掉了,根據不一樣的狀況固然也有不一樣的作法。
寫配置文件也基本相似,只是須要把數值類型的變量格式化成字符串再行存儲:
str.Format("%d",m_nXPos); WritePrivateProfileString("SECTION 1","XPos",str,exeFullPath); str.Format("%d",m_nYPos); WritePrivateProfileString("SECTION 1","YPos",str,exeFullPath); WritePrivateProfileString("SECTION 2","Text",m_strText,exeFullPath);
咱們必定遇到過這樣的程序:在執行過一遍之後,重啓系統會自動加載該程序,其實除了在啓動菜單和註冊表添加信息外,也能夠用 WriteProfileString()函數向win.ini的"windows"節的"run"項目添加應用程序的全路徑來實現,這要比其它兩種方法簡便的多,並且也比較安全。

二.將信息從INI文件中讀入程序中的變量.
1.所用的WINAPI函數原型爲:
DWORD GetPrivateProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName );
其中各參數的意義:
前二個參數與 WritePrivateProfileString中的意義同樣.
lpDefault : 若是INI文件中沒有前兩個參數指定的字段名或鍵名,則將此值賦給變量.
lpReturnedString : 接收INI文件中的值的CString對象,即目的緩存器.
nSize : 目的緩存器的大小.
lpFileName : 是完整的INI文件名.
2.具體使用方法:現要將上一步中寫入的學生的信息讀入程序中.
CString strStudName; int nStudAge; GetPrivateProfileString("StudentInfo","Name","默認姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c:\stud\student.ini");
執行後 strStudName 的值爲:"張三",若前兩個參數有誤,其值爲:"默認姓名".
3.讀入整型值要用另外一個WINAPI函數:
UINT GetPrivateProfileInt( LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault, LPCTSTR lpFileName );
這裏的參數意義與上相同.使用方法以下: nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\stud\student.ini");

貼上本身WIN32測試並經過的一段例子(部分代碼,主要功能是如何配置相對路徑,後續操做,前面已經有了)緩存

 

1    char *p = NULL;  安全

2    char exeFullPath[128];  函數

3    int len=GetModuleFileName(NULL, 測試

 4        exeFullPath,                    //應用程序的全路徑存放地址  spa

5        128); 操作系統

 6    p=strrchr(exeFullPath, '\\');        //屏蔽掉項目名稱 debug

 7    *p='\0';  orm

8    p=strrchr(exeFullPath, '\\');        //屏蔽掉DEBUG(實際開發中這個可能不須要)  對象

9    *p='\0';

10    len = strlen(exeFullPath);

11    string path="\\system.ini";            //配置文件名

12    ::strcpy(exeFullPath+len,path.c_str()); //組合出配置文件的全路徑

13

14

15    char ipstr[20];                        //存儲IP地址

16    GetPrivateProfileString("Server","ServerIP",NULL,ipstr,20,exeFullPath);

17    int port;

18    port = GetPrivateProfileInt("Server","Port",0,exeFullPath);  

下面這段是公司裏工做時候寫的,作個記錄    

1    //////////////////////////////////////////將內容以','分離  

2    string strFream = szFream;  

3    vector<string> strVec;

 4    char cTrim = ',';  

5    std::string::size_type pos1, pos2;  

6    pos2 = 0;  

7    while (pos2 != std::string::npos)  

8    {  

9        pos1 = strFream.find_first_not_of(cTrim, pos2);

10        if (pos1 == std::string::npos)

11            break;

12        pos2 = strFream.find_first_of(cTrim, pos1 + 1);

13        if (pos2 == std::string::npos)

14        {

15            if (pos1 != strFream.size())

16                strVec.push_back(strFream.substr(pos1));

17            break;

18        }

19        strVec.push_back(strFream.substr(pos1, pos2 - pos1));

20    }

21    for(int i = 0; i < strVec.size();++i)

22    {

23        int nTemp = atoi(strVec[i].c_str());

24        if(nTemp < m_nFrameNum)

25            m_vecFrame.push_back(nTemp);

26        else continue;

27    }

相關文章
相關標籤/搜索