C++讀取INI檔案

來源:互聯網
上載者:User

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是項目名的大小,但是不同項目可能名字不一樣,定義這樣的長度過於機械化

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,                    //應用程式的全路徑存放地址
 5        128);
 6    p=strrchr(exeFullPath, '\\');        //屏蔽掉項目名稱
 7    *p='\0';
 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    }
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.