日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++读取INI文件

發布時間:2024/7/19 c/c++ 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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是項目名的大小,但是不同項目可能名字不一樣,定義這樣的長度過于機械化

1char*p?=NULL;
2????charexeFullPath[128];
3????intlen=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測試并通過的一段例子(部分代碼,主要功能是如何配置相對路徑,后續操作,前面已經有了)

1char*p?=NULL;
2????charexeFullPath[128];
3????intlen=GetModuleFileName(NULL,
4????????exeFullPath,????????????????????//應用程序的全路徑存放地址
5128);
6????p=strrchr(exeFullPath,?'\\');????????//屏蔽掉項目名稱
7*p='\0';
8????p=strrchr(exeFullPath,?'\\');????????//屏蔽掉DEBUG(實際開發中這個可能不需要)
9*p='\0';
10????len?=strlen(exeFullPath);
11????stringpath="\\system.ini";????????????//配置文件名
12::strcpy(exeFullPath+len,path.c_str());?//組合出配置文件的全路徑
13
14
15????charipstr[20];????????????????????????//存儲IP地址
16GetPrivateProfileString("Server","ServerIP",NULL,ipstr,20,exeFullPath);
17????intport;
18????port?=GetPrivateProfileInt("Server","Port",0,exeFullPath);



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

1//將內容以','分離
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????}

轉載于:https://www.cnblogs.com/qq78292959/archive/2012/06/10/2544389.html

總結

以上是生活随笔為你收集整理的C++读取INI文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。