C++读取INI文件
Windows操作系統(tǒng)專(zhuān)門(mén)為此提供了6個(gè)API函數(shù)來(lái)對(duì)配置設(shè)置文件進(jìn)行讀、寫(xiě):
GetPrivateProfileInt() 從私有初始化文件獲取整型數(shù)值
GetPrivateProfileString() 從私有初始化文件獲取字符串型值
GetProfileInt 從win.ini 獲取整數(shù)值
GetProfileString 從win.ini 獲取字符串值
WritePrivateProfileString 寫(xiě)字符串到私有初始化文件
WriteProfileString 寫(xiě)字符串到win.ini
我們可以把視圖類(lèi)的:OnInitialUpdate() 函數(shù)作為程序啟動(dòng)時(shí)讀取配置文件的入口,配置文件的存儲(chǔ)格式如下:
[SECTION 1]
XPos=300
YPos=200
[SECTION 2]
Text=Hello
僅有兩個(gè)節(jié),XPos和YPos標(biāo)明了待顯示信息的坐標(biāo),而待顯示的信息存儲(chǔ)在第二節(jié)的Text項(xiàng)中,用讀取訪問(wèn)私有配置設(shè)置文件的API函數(shù)將其分別讀入到變量m_nXPos,m_nYPos和m_strText中,并通過(guò)Invalidate()調(diào)用OnDraw()函數(shù),在其內(nèi)用TextOut函數(shù)將該信息在讀取的坐標(biāo)位置顯示出來(lái):
m_nXPos=GetPrivateProfileInt("SECTION 1", //節(jié)名
"XPos", //項(xiàng)名
0, //沒(méi)找到此項(xiàng)時(shí)的缺省返回值
"C:\test\debug\test.ini"); //配置文件的準(zhǔn)確路徑
m_nYPos=GetPrivateProfileInt("SECTION 1","YPos",0,exeFullPath);
char buf[256];
len=GetPrivateProfileString("SECTION 2", //節(jié)名
"Text", //項(xiàng)名
"No Text", //沒(méi)找到此項(xiàng)時(shí)的返回值
buf, //目標(biāo)緩沖區(qū)地址
256, //目標(biāo)緩沖區(qū)長(zhǎng)度
"C:\test\debug\test.ini"); //配置文件的準(zhǔn)確路徑
for(int i=0;i<len;i++)
{
???CString str;
???str.Format("%c",buf[i]);
???m_strText+=str;
}
Invalidate();
一般配置文件是和應(yīng)用程序存放在同一個(gè)目錄中的如果用"C:\test\debug\test.ini"的絕對(duì)路徑進(jìn)行設(shè)置就會(huì)出現(xiàn)路徑改變后找不到配置文件的問(wèn)題,所以應(yīng)動(dòng)態(tài)搜尋配置文件的存放地址:
Tchar exeFullPath[MAX_PATH]; // MAX_PATH在API中有定義,為128
int len=GetModuleFileName(NULL,
exeFullPath, //應(yīng)用程序的全路徑存放地址
MAX_PATH);
CString path="\test.ini"; //配置文件名
::strcpy(exeFullPath+len-13,path); //組合出配置文件的全路徑
值得注意的是這里的13是項(xiàng)目名的大小,但是不同項(xiàng)目可能名字不一樣,定義這樣的長(zhǎng)度過(guò)于機(jī)械化
2????charexeFullPath[128];
3????intlen=GetModuleFileName(NULL,
4????????exeFullPath,????????????????128);
5????p=strrchr(exeFullPath,?'\\');???
6????*p='\0';
這樣,通過(guò)strrchr函數(shù)屏蔽掉最后出現(xiàn)的'\'就能夠把項(xiàng)目名也屏蔽掉了,根據(jù)不同的情況當(dāng)然也有不同的做法。
寫(xiě)配置文件也基本類(lèi)似,只是需要把數(shù)值類(lèi)型的變量格式化成字符串再行存儲(chǔ):
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);
我們一定遇到過(guò)這樣的程序:在執(zhí)行過(guò)一遍以后,重啟系統(tǒng)會(huì)自動(dòng)加載該程序,其實(shí)除了在啟動(dòng)菜單和注冊(cè)表添加信息外,也可以用 WriteProfileString()函數(shù)向win.ini的"windows"節(jié)的"run"項(xiàng)目添加應(yīng)用程序的全路徑來(lái)實(shí)現(xiàn),這要比其它兩種方法簡(jiǎn)便的多,而且也比較安全。
二.將信息從INI文件中讀入程序中的變量.
1.所用的WINAPI函數(shù)原型為:
DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);
其中各參數(shù)的意義:
前二個(gè)參數(shù)與 WritePrivateProfileString中的意義一樣.
lpDefault : 如果INI文件中沒(méi)有前兩個(gè)參數(shù)指定的字段名或鍵名,則將此值賦給變量.
lpReturnedString : 接收INI文件中的值的CString對(duì)象,即目的緩存器.
nSize : 目的緩存器的大小.
lpFileName : 是完整的INI文件名.
2.具體使用方法:現(xiàn)要將上一步中寫(xiě)入的學(xué)生的信息讀入程序中.
CString strStudName;
int nStudAge;
GetPrivateProfileString("StudentInfo","Name","默認(rèn)姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c:\stud\student.ini");
執(zhí)行后 strStudName 的值為:"張三",若前兩個(gè)參數(shù)有誤,其值為:"默認(rèn)姓名".
3.讀入整型值要用另一個(gè)WINAPI函數(shù):
UINT GetPrivateProfileInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault,
LPCTSTR lpFileName
);
這里的參數(shù)意義與上相同.使用方法如下:
nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c:\stud\student.ini");
貼上自己WIN32測(cè)試并通過(guò)的一段例子(部分代碼,主要功能是如何配置相對(duì)路徑,后續(xù)操作,前面已經(jīng)有了)
2????charexeFullPath[128];
3????intlen=GetModuleFileName(NULL,
4????????exeFullPath,????????????????????//應(yīng)用程序的全路徑存放地址
5128);
6????p=strrchr(exeFullPath,?'\\');????????//屏蔽掉項(xiàng)目名稱(chēng)
7*p='\0';
8????p=strrchr(exeFullPath,?'\\');????????//屏蔽掉DEBUG(實(shí)際開(kāi)發(fā)中這個(gè)可能不需要)
9*p='\0';
10????len?=strlen(exeFullPath);
11????stringpath="\\system.ini";????????????//配置文件名
12::strcpy(exeFullPath+len,path.c_str());?//組合出配置文件的全路徑
13
14
15????charipstr[20];????????????????????????//存儲(chǔ)IP地址
16GetPrivateProfileString("Server","ServerIP",NULL,ipstr,20,exeFullPath);
17????intport;
18????port?=GetPrivateProfileInt("Server","Port",0,exeFullPath);
下面這段是公司里工作時(shí)候?qū)懙?#xff0c;做個(gè)記錄
2stringstrFream?=szFream;
3????vector<string>strVec;
4????charcTrim?=',';
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(inti?=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????}
轉(zhuǎn)載于:https://www.cnblogs.com/qq78292959/archive/2012/06/10/2544389.html
總結(jié)
以上是生活随笔為你收集整理的C++读取INI文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 阅读作业2王冬篇
- 下一篇: C++ primer 4th 第10章《