C/C++ ini配置文件的格式及如何读写ini配置文件
一、ini配置文件的格式
為什么要用INI文件?如果我們程序沒有任何配置文件時,這樣的程序對外是全封閉的,一旦程序需要修改一些參數必須要修改程序代碼本身并重新編譯,這樣很不好,所以要用配置文件,讓程序發布后還能根據需要進行必要的配置;配置文件有很多如INI配置文件,XML配置文件,還有就是可以使用系統注冊表等。
本文主要是為讀者在實現讀寫INI配置文件模塊之前,提供有關INI文件的格式信息。在早期的windows桌面系統中主要是用INI文件作為系統的配置文件,從win95以后開始轉向使用注冊表,但是還有很多系統配置是使用INI文件的。其實INI文件就是簡單的text文件,只不過這種txt文件要遵循一定的INI文件格式。現在的WINCE系統上也常常用INI文件作為配置文件,這次研究INI文件的目的就是為了 給我的對接報警服務程序添加配置文件。“.INI ”就是英文 “initialization”的頭三個字母的縮寫;當然INI file的后綴名也不一定是".ini"也可以是".cfg",".conf ”或者是".txt"。
1、INI文件由節、鍵、值組成。
節
[section]
參數(鍵=值)
name=value
注解
注解使用分號表示(;)。在分號后面的文字,直到該行結尾都全部為注解。
2、INI文件的格式很簡單,最基本的三個要素是:sections,parameters和comments。
什么是sections ?
所有的parameters都是以sections為單位結合在一起的。所有的section名稱都是獨占一行,并且sections名字都被方括號包圍著([ and ])。在section聲明后的所有parameters都是屬于該section。對于一個section沒有明顯的結束標志符,一個section的開始就是上一個section的結束,或者是end of the file。Sections一般情況下不能被nested,當然特殊情況下也可以實現sections的嵌套。
section如下所示:
[section]
什么是parameters?
INI所包含的最基本的“元素”就是parameter;每一個parameter都有一個name和一個value,name和value是由等號“=”隔開。name在等號的左邊。
例子如下:
name = value
什么是comments?
在INI文件中注釋語句是以分號“;”開始的。所有的所有的注釋語句不管多長都是獨占一行直到結束的,在分號和行結束符之間的所有內容都是被忽略的。
注釋實例如下:
;comments text
二、C/C++讀寫ini配置文件
我們可能經常用到配置文件ini文件來獲取或者保存參數信息,在VC中涉及的函數有如下四種
讀寫INI文件時相對路徑和絕對路徑都可以,根據實際情況選擇
“…\IniFileName.ini” // 這樣的為相對路徑
“D:\IniFileName.ini” // 這樣的為絕對路徑
MAX_PATH:是微軟最大路徑占的字節所設的宏
讀取配置表
(1)讀取字符串(返回值為string的長度(long型),而從ini文件獲得的字符串則保留在目的緩沖器中)
DWORD GetPrivateProfileString(?
?? ??? ??? ??? ??? ??? ??? ??? ?LPCTSTR lpAppName, ? ? ? ?// INI文件中的一個字段名[節名]可以有很多個節名(配置文件的section名)
?? ??? ??? ??? ??? ??? ? ?? ? ? ?? ?LPCTSTR lpKeyName, ? ? ? ?// lpAppName 下的一個鍵名,也就是里面具體的變量名(配置文件的key名)
??? ??? ??? ??? ??? ??? ??? ? ? ?? ?LPCTSTR lpDefault, ? ? ? ?// 如果lpReturnedString為空,則把這個變量賦給lpReturnedString
? ?? ??? ??? ??? ??? ??? ??? ? ? ?? ?LPTSTR lpReturnedString, ?// 存放鍵值的指針變量,用于接收INI文件中鍵值(數據)的接收緩沖區
? ?? ??? ??? ??? ??? ??? ? ?? ? ? ?? ?DWORD nSize, ? ? ? ? ? ? ?// lpReturnedString的緩沖區大小
? ?? ??? ??? ??? ??? ??? ??? ? ? ?? ?LPCTSTR lpFileName ? ? ? ?// INI文件的路徑
?? ??? ??? ??? ??? ??? ??? ? );
備注:返回值類型為Long,返回值為lpReturnedString緩沖區的字節長度,其中不包括那些NULL中止字符。如果lpReturnedString緩沖區不夠大,不能容下全部信息,就返回nSize-1(若lpApplicationName或lpKeyName為NULL,則返回nSize-2)
(2)讀取整型值 (返回值為從ini配置中讀到的整數)
UINT GetPrivateProfileInt(
??? ??? ?LPCTSTR lpAppName, ? // INI文件中的一個字段名[節名]可以有很多個節名
??? ??? ?LPCTSTR lpKeyName, ? // lpAppName 下的一個鍵名,也就是里面具體的變量名
??? ??? ?INT nDefault, ? ? ? ?// 如果沒有找到指定的數據返回,則把個變量值賦給返回值
? ?? ??? ?LPCTSTR lpFileName ? // INI文件的路徑
?? ??? ?);
寫入配置表
(1)寫入字符串(返回值類型為Long,非零表示成功,零表示失敗。會設置GetLastError)
BOOL WritePrivateProfileString(
? ?? ??? ??? ?LPCTSTR lpAppName, ?// INI文件中的一個字段名[節名]可以有很多個節名
? ?? ??? ??? ?LPCTSTR lpKeyName, ?// lpAppName 下的一個鍵名,也就是里面具體的變量名
? ?? ??? ??? ?LPCTSTR lpString, ? // 鍵值,也就是數據
? ?? ??? ??? ?LPCTSTR lpFileName ?// INI文件的路徑
?? ??? ??? ?);
(2)寫入整數值(沒有相關函數,可以通過WritePrivateProfileString進行參數轉換來實現)
暫無
程序實例:
LPTSTR lpPath = new char[MAX_PATH];
?
strcpy(lpPath, "D:\\IniFileName.ini");
?
WritePrivateProfileString("LiMing", "Sex", "Man", lpPath);
WritePrivateProfileString("LiMing", "Age", "20", lpPath);
?
WritePrivateProfileString("Fangfang", "Sex", "Woman", lpPath);
WritePrivateProfileString("Fangfang", "Age", "21", lpPath);
?
delete [] lpPath;
?
INI文件如下:
?
[LiMing]
Sex=Man
Age=20
[Fangfang]
Sex=Woman
Age=21
?
讀INI文件:
?
LPTSTR lpPath = new char[MAX_PATH];
LPTSTR LiMingSex = new char[6];
int LiMingAge;
LPTSTR FangfangSex = new char[6];
int FangfangAge;
strcpy(lpPath, "..\\IniFileName.ini");
?
GetPrivateProfileString("LiMing", "Sex", "", LiMingSex, 6, lpPath);
LiMingAge = GetPrivateProfileInt("LiMing", "Age", 0, lpPath);
?
GetPrivateProfileString("Fangfang", "Sex", "", FangfangSex, 6, lpPath);
FangfangAge = GetPrivateProfileInt("Fangfang", "Age", 0, lpPath);
delete [] lpPath;
?
?
總結
以上是生活随笔為你收集整理的C/C++ ini配置文件的格式及如何读写ini配置文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 查看空间(内存、磁盘、文件
- 下一篇: s3c2440移植MQTT