您好,登錄后才能下訂單哦!
本篇文章為大家展示了C++中怎么操作INI文件,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
1、存儲程序的初始化信息; 2、存儲需要保存的數據信息。
由節名、鍵名、鍵值組成。形式如下: [節名] 鍵名 = 鍵值
備注:一個INI文件,可以用多個節。
該函數用于向INI文件中寫入一個字符串數據。
函數原型如下:
BOOL WritePrivateProfileString( LPCTSTR lpAppName, // pointer to section name LPCTSTR lpKeyName, // pointer to key name LPCTSTR lpString, // pointer to string to add LPCTSTR lpFileName // pointer to initialization filename);
參數說明:
lpAppName:指定節名,以空終止結尾的字符串。如果INI文件中節名不存在,將創建一個節名。 lpKeyName:鍵名,以空終止結尾的字符串。如果INI文件中該鍵名不存在,將創建一個鍵名。如果該參數為NULL,包括節及節下的所有項目都將被刪除。 lpString:寫到鍵值中的數據,以空終止結尾的字符串。 lpFileName:INI文件的名稱,以空終止結尾的字符串。指定需要寫入數據的INI文件,如果指定的INI文件不存在將創建。
返回值:
如果函數成功將字符串復制到初始化文件,返回值是非零。 如果函數失敗,刷新緩存版本的最近訪問初始化文件,返回值是零。
該函數用于獲取INI文件中的鍵值。 函數原型如下:
DWORD GetPrivateProfileString( LPCTSTR lpAppName, // points to section name LPCTSTR lpKeyName, // points to key name LPCTSTR lpDefault, // points to default string LPTSTR lpReturnedString, // points to destination buffer DWORD nSize, // size of destination buffer LPCTSTR lpFileName // points to initialization filename);
參數說明:
lpAppName:指定節名,以空終止結尾的字符串。如果該參數為NULL,函數將復制所有的節名到所指定的緩沖區中。 lpKeyName:鍵名,以空終止結尾的字符串。如果該參數為NULL,函數將lpAppName節下所有的鍵名復制到lpReturnedString緩沖區。 lpDefault:默認值,以空終止結尾的字符串。如果獲取鍵值的鍵名不存在時,返回設置的默認值。 lpReturnedString:用于接受數據的緩沖區。 nSize:以字符為單位表示lpReturnedString緩沖區的大小。 lpFileName:INI文件名稱,以空終止結尾的字符串。
返回值: 返回值是字符復制到緩沖區的數量,不包括終止null字符。
該函數用于從INI文件中獲取整型數據。 函數原型如下:
UINT GetPrivateProfileInt( LPCTSTR lpAppName, // address of section name LPCTSTR lpKeyName, // address of key name INT nDefault, // return value if key name is not found LPCTSTR lpFileName // address of initialization filename);
參數說明: lpAppName:節名。 lpKeyName:鍵名。 nDefault:默認值。 lpFileName:INI文件名稱。
返回值:
函數返回實際讀取的整數值。
該函數用于返回INI文件中的所有節名。 函數原型如下:
DWORD GetPrivateProfileSectionNames( LPTSTR lpszReturnBuffer, // address of return buffer DWORD nSize, // size of return buffer LPCTSTR lpFileName // address of initialization filename);
參數說明: lpszReturnBuffer:接受節名的數據緩沖區。 nSize:緩沖區的大小。 lpFileName:INI文件名稱。 返回值: 返回值指定數量的字符復制到指定的緩沖,不包括終止null字符。 如果緩沖區沒有大到足以包含所有相關的部分名稱指定的初始化文件,返回值等于指定的長度nSize - 2。
該函數用于獲取指定節下的所有的鍵名和鍵值。 函數原型如下:
DWORD GetPrivateProfileSection( LPCTSTR lpAppName, // address of section name LPTSTR lpReturnedString, // address of return buffer DWORD nSize, // size of return buffer LPCTSTR lpFileName // address of initialization filename);
參數說明:
lpAppName:節名。 lpReturnedString:用于接受數據的緩沖區。 nSize:緩沖區的大小。 lpFileName:INI文件名稱。 返回值: 返回值指定數量的字符復制到緩沖區,不包括終止null字符。 如果緩沖區沒有大到足以包含所有與指定相關聯的鍵名稱和值對部分,返回值等于nSize - 2。
CMyINI.h
#pragma once#include <iostream>#include <fstream>#include <sstream>#include <vector>#include <cstdlib>#include <map> using namespace std; //INI文件結點存儲結構class ININode{public:ININode(string root, string key, string value){this->root = root;this->key = key;this->value = value;}string root;string key;string value;}; //鍵值對結構體class SubNode{public:void InsertElement(string key, string value){sub_node.insert(pair<string, string>(key, value));}map<string, string> sub_node;}; //INI文件操作類class CMyINI{public:CMyINI();~CMyINI(); public:int ReadINI(string path);//讀取INI文件string GetValue(string root, string key);//由根結點和鍵獲取值vector<ININode>::size_type GetSize(){ return map_ini.size(); }//獲取INI文件的結點數vector<ININode>::size_type SetValue(string root, string key, string value);//設置根結點和鍵獲取值int WriteINI(string path);//寫入INI文件void Clear(){ map_ini.clear(); }//清空void Travel();//遍歷打印INI文件private:map<string, SubNode> map_ini;//INI文件內容的存儲變量};
CMyINI.cpp
#include "StdAfx.h"#include "MyINI.h" #define INIDEBUG CMyINI::CMyINI(){} CMyINI::~CMyINI(){} //************************************************************************// 函數名稱: TrimString// 訪問權限: public // 創建日期:2017/01/05// 創 建 人:// 函數說明:去除空格// 函數參數: string & str輸入的字符串// 返 回 值: std::string &結果字符串//************************************************************************string &TrimString(string &str){string::size_type pos = 0;while (str.npos != (pos = str.find(" ")))str = str.replace(pos, pos + 1, "");return str;} //************************************************************************// 函數名稱: ReadINI// 訪問權限: public // 創建日期:2017/01/05// 創 建 人:// 函數說明:讀取INI文件,并將其保存到map結構中// 函數參數: string pathINI文件的路徑// 返 回 值: int//************************************************************************int CMyINI::ReadINI(string path){ifstream in_conf_file(path.c_str());if (!in_conf_file) return 0;string str_line = "";string str_root = "";vector<ININode> vec_ini;while (getline(in_conf_file, str_line)){string::size_type left_pos = 0;string::size_type right_pos = 0;string::size_type equal_p_pos = 0;string str_key = "";string str_value = "";if ((str_line.npos != (left_pos = str_line.find("["))) && (str_line.npos != (right_pos = str_line.find("]")))){//cout << str_line.substr(left_pos+1, right_pos-1) << endl;str_root = str_line.substr(left_pos + 1, right_pos - 1);} if (str_line.npos != (equal_p_pos = str_line.find("="))){str_key = str_line.substr(0, equal_p_pos);str_value = str_line.substr(equal_p_pos + 1, str_line.size() - 1);str_key = TrimString(str_key);str_value = TrimString(str_value);//cout << str_key << "=" << str_value << endl;} if ((!str_root.empty()) && (!str_key.empty()) && (!str_value.empty())){ININode ini_node(str_root, str_key, str_value);vec_ini.push_back(ini_node);//cout << vec_ini.size() << endl;}}in_conf_file.close();in_conf_file.clear(); //vector convert to mapmap<string, string> map_tmp;for (vector<ININode>::iterator itr = vec_ini.begin(); itr != vec_ini.end(); ++itr){map_tmp.insert(pair<string, string>(itr->root, ""));}//提取出根節點for (map<string, string>::iterator itr = map_tmp.begin(); itr != map_tmp.end(); ++itr){#ifdef INIDEBUGcout << "根節點: " << itr->first << endl;#endif//INIDEBUGSubNode sn;for (vector<ININode>::iterator sub_itr = vec_ini.begin(); sub_itr != vec_ini.end(); ++sub_itr){if (sub_itr->root == itr->first){#ifdef INIDEBUGcout << "鍵值對: " << sub_itr->key << "=" << sub_itr->value << endl;#endif//INIDEBUGsn.InsertElement(sub_itr->key, sub_itr->value);}}map_ini.insert(pair<string, SubNode>(itr->first, sn));}return 1;} //************************************************************************// 函數名稱: GetValue// 訪問權限: public // 創建日期:2017/01/05// 創 建 人:// 函數說明:根據給出的根結點和鍵值查找配置項的值// 函數參數: string root配置項的根結點// 函數參數: string key配置項的鍵// 返 回 值: std::string配置項的值//************************************************************************string CMyINI::GetValue(string root, string key){map<string, SubNode>::iterator itr = map_ini.find(root);map<string, string>::iterator sub_itr = itr->second.sub_node.find(key);if (!(sub_itr->second).empty())return sub_itr->second;return "";} //************************************************************************// 函數名稱: WriteINI// 訪問權限: public // 創建日期:2017/01/05// 創 建 人:// 函數說明:保存XML的信息到文件中// 函數參數: string pathINI文件的保存路徑// 返 回 值: int//************************************************************************int CMyINI::WriteINI(string path){ofstream out_conf_file(path.c_str());if (!out_conf_file)return -1;//cout << map_ini.size() << endl;for (map<string, SubNode>::iterator itr = map_ini.begin(); itr != map_ini.end(); ++itr){//cout << itr->first << endl;out_conf_file << "[" << itr->first << "]" << endl;for (map<string, string>::iterator sub_itr = itr->second.sub_node.begin(); sub_itr != itr->second.sub_node.end(); ++sub_itr){//cout << sub_itr->first << "=" << sub_itr->second << endl;out_conf_file << sub_itr->first << "=" << sub_itr->second << endl;}} out_conf_file.close();out_conf_file.clear(); return 1;} //************************************************************************// 函數名稱: SetValue// 訪問權限: public // 創建日期:2017/01/05// 創 建 人:// 函數說明:設置配置項的值// 函數參數: string root配置項的根節點// 函數參數: string key配置項的鍵// 函數參數: string value配置項的值// 返 回 值: std::vector<ININode>::size_type//************************************************************************vector<ININode>::size_type CMyINI::SetValue(string root, string key, string value){map<string, SubNode>::iterator itr = map_ini.find(root);//查找if (map_ini.end() != itr){//itr->second.sub_node.insert(pair<string, string>(key, value));itr->second.sub_node[key] = value;}//根節點已經存在了,更新值else{SubNode sn;sn.InsertElement(key, value);map_ini.insert(pair<string, SubNode>(root, sn));}//根節點不存在,添加值 return map_ini.size();} //************************************************************************// 函數名稱: Travel// 訪問權限: public // 創建日期:2017/01/05// 創 建 人:// 函數說明:遍歷打印INI文件// 返 回 值: void//************************************************************************void CMyINI::Travel(){for (map<string, SubNode>::iterator itr = this->map_ini.begin(); itr!= this->map_ini.end(); ++itr){//rootcout << "[" << itr->first << "]" << endl;for (map<string, string>::iterator itr1=itr->second.sub_node.begin(); itr1!=itr->second.sub_node.end();++itr1){cout << " " << itr1->first << " = " << itr1->second << endl;}}}
測試之前INI文件的內容:
測試程序:
CMyINI *p = new CMyINI();p->ReadINI("Setting.ini");cout << "\n原始INI文件內容:" << std::endl;p->Travel();p->SetValue("setting", "hehe", "eheh");cout << "\n增加節點之后的內容:" << std::endl;p->Travel();cout << "\n修改節點之后的內容:" << std::endl;p->SetValue("kk", "kk", "2");p->Travel();p->WriteINI("Setting.ini");
測試結果:
ini文件是由若干個節(Sction)組成,每個節又由若干個鍵(Key)組成。1、將文件寫入ini文件中,主要使用的函數是WritePrivateProfileString(LPCWSTR IpAppName,LPCWSTR IpKeyName,LPCWSTR IpString,LPCWSTR IpFileName);參數一表示節的名字,參數二表示鍵的名字,若為NULL,則刪除整個節,參數三表示鍵的值,若為NULL,則刪除這個鍵,參數四表示文件名。
#ifndef CONFIG_FILE#define CONFIG_FILE (_T("Config.ini"))#endifTCHAR IniPath[MAX_PATH]={0}GetModuleFileName(NULL,IniPath,Max_Path); TCHAR *pFind=_tcsrchr(IniPath,'\\');if(pFind==NULL){return;}*pFind='';CString newIniPath=IniPath;newIniPath+="\\";newIniPath+=CONFIG_FILE;
寫入........
2、將ini文件中的配置信息讀取出來,主要使用的函數為GetPrivateProfileString(LPCWSTR IpAppName,LPCWSTR IpKeyName,LPCWSTR IpDefault,LPCWSTR IpReturnedString,DWORD nSize,LPCWSTR IpFileName)和GetPrivateProfileInt(LPCWSTR IpAppName,LPCWSTR IpKeyName,Int nDefault,LPCWSTR IpFileName);GetPrivateProfileString:參數一表示節的名字,參數二表示鍵的名字,參數三表示如果指定的鍵名不存在時所默認的讀取值,參數四用來接收讀取的字符串,參數五指定lpReturnedString指向的緩沖區的大小 ,參數六表示文件名。GetPrivateProfileInt:參數一表示節的名字,參數二表示鍵的名字,參數三表示如果指定的鍵名不存在時所默認的讀取值,參數四表示文件名。
TCHAR IniPath[MAX_PATH]={0};GetModuleFileName(NULL,IniPath,Max_Path);IniPath[_tcslen(IniPath)-1]='i'IniPath[_tcslen(IniPath)-2]='n'IniPath[_tcslen(IniPath)-3]='i'if(!PathFileExists(IniPath)){}
上述內容就是C++中怎么操作INI文件,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。