C/C++ 關於如何讀寫ini配置文件 (小結)


我們可能經常用到配置文件ini文件來獲取或者保存參數信息,在VC中其函數中主要用到的有:
  • 讀取
  1. 讀取字符  

    DWORD GetPrivateProfileString(
      LPCTSTR
     lpAppName,        // INI文件中的一個字段名[節名]可以有很多個節名

      LPCTSTR lpKeyName,        // lpAppName 下的一個鍵名,也就是里面具體的變量名

      LPCTSTR lpDefault,        // 如果lpReturnedString為空,則把個變量賦給lpReturnedString

      LPTSTR lpReturnedString // 存放鍵值的指針變量,用於接收INI文件中鍵值(數據)的接收緩沖區

      DWORD nSize,            // lpReturnedString的緩沖區大小

      LPCTSTR lpFileName        // INI文件的路徑
    );

  2. 讀取整型值 (返回值為讀到的整)

    UINT GetPrivateProfileInt(

      LPCTSTR lpAppName // INI文件中的一個字段名[節名]可以有很多個節名
      LPCTSTR lpKeyName // lpAppName 下的一個鍵名,也就是里面具體的變量名
      INT nDefault,       // 如果沒有找到指定的數據返回,則把個變量值賦給返回值

      LPCTSTR lpFileName  // INI文件的路徑

    );

  • 寫入
  1. 寫入字符  

    BOOL WritePrivateProfileString(
      LPCTSTR
     lpAppName // INI文件中的一個字段名[節名]可以有很多個節名

      LPCTSTR lpKeyName // lpAppName 下的一個鍵名,也就是里面具體的變量名

      LPCTSTR lpString,   // 鍵值,也就是數據

      LPCTSTR lpFileName  // INI文件的路徑
    );

  2. 寫入整型
  • 讀寫INI文件時相對路徑和絕對路徑都可以,根據實際情況選擇

 

  "..\\IniFileName.ini"    // 這樣的為相對路徑

  "D:\\IniFileName.ini"    // 這樣的為絕對路徑

  • MAX_PATH:是微軟最大路徑占的字節所設的宏

  寫入的ini文件 分為:節、鍵名、鍵值

  舉個栗子:

  // XX.ini

  [串口配置]

  波特率=19200

有了理論,再看看實踐的demo:

  • 寫INI文件: 

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文件:

 TCHAR FPath[128];

::GetCurrentDirectory(MAX_PATH, FPath);
strcat(FPath, ".\\Config.ini");
CFile ConfigFile;
if(!ConfigFile.Open(FPath, CFile::modeCreate||CFile::modeRead, NULL))
{
AfxMessageBox("打開Config.ini配置文件失敗!!!");
return FALSE;
}
ConfigFile.Close();

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;

 

配置文件中經常用到ini文件,在VC中其函數分別為:

寫入.ini文件:bool WritePrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpString,LPCTSTR lpFileName);

讀取.ini文件:DWORD GetPrivateProfileString(LPCTSTR lpAppName,LPCTSTR lpKeyName,LPCTSTR lpDefaut,LPSTR lpReturnedString,DWORD nSize,LPCTSTR lpFileName);

讀取整形值:UINT GetPrivateProfileInt(LPCTSTR lpAppName,LPCTSTR lpKeyName,INT nDefault,LPCTSTR lpFileName);

其中個參數的意思:

LPCTSTR lpAppName ------- INI文件中的一個字段名

LPCTSTR lpKeyName -------- lpAppName 下的一個鍵名,也就是里面具體的變量名

LPCTSTR lpString ---------是鍵值,也就是變量的值, 必須為LPCTSTR或CString類型

LPCTSTR lpFileName --------完整的INI文件路徑名

LPCTSTR lpDefaut ----------如果沒有其前兩個參數值,則將此值賦給變量

LPSTR lpReturnedString --------接收INI文件中的值的CString對象,即接收緩沖區

DWORD nSize ------接收緩沖區的大小

例子:

CString StrName,Strtemp;

int nAge;

StrName = "jacky";

nAge = 13;

WritePrivateProfileString("Student","Name",StrName,"c:\\setting.ini");

結果:(INI文件中顯示如下:)

[Student]

Name=jacky

讀取:

CString SName;

GetPrivateProfileString("Student","Name","DefaultName",SName.GetBuffer(MAX_LENGTH),MAX_LENGTH,"c:\\setting.ini");

結果:SName = "jacky";這里需要注意點就是用完GetBuffer函數后一定要釋放(用SName.ReleaseBuffer()函數),不然后面再用到SName的其他子函數就會失靈。

讀整數比較簡單,如下

int Result = GetPrivateProfileInt("Student","nAge",0,"c:\\setting.ini")返回值即為所讀取的結果!

GetPrivateProfileString最后一個參數是配置文件路徑的參數,此路徑只能是絕對路徑,不能是相對路徑,但現在我需要是我的exe文件能和我的配置文件在一起。因此我使用了GetCurrentDirectory函數。

原代碼如下:

CString server_ip;
CString des="";
::GetCurrentDirectory(MAX_PATHLENGTH,des.GetBuffer(MAX_PATHLENGTH));
des.ReleaseBuffer();
des+="\\config.ini";
GetPrivateProfileString("PhoneDemo","Server_IP","",server_ip.GetBufferSetLength(15),15,des);
server_ip.ReleaseBuffer();

注意:在這里使用CString變量時,在使用完GetBuffer后,緊接着一定要使用ReleaseBuffer()函數,才可以進行其他的諸如字符串+操作;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM