本文主要是分享C/C INI文件操作代码,添加注释,修复一些问题。在这里给出完整的实现文件,只在需要的地方包含头文件。
目录
I . INI文件的使用:II .INI文件的结构。读取ini文件1、WritePrivateProfileString2、GetPrivateProfileString3、GetPrivateProfileInt4、GetPrivateProfileConnections 5、GetPrivateProfileSection IV、C读写INI文件完整代码V、C读写INI文件中的配置信息
一、INI文件用途:
1.存储程序的初始化信息;
2.存储要保存的数据信息。
二、INI文件结构:
它由节名、键名和键值组成。其形式如下:
[部分名称]
键名=键值
备注:一个INI文件可以使用多个部分。
三、读取INI文件
1、WritePrivateProfileString
这个函数用来将一个字符串数据写入INI文件。
功能原型如下:
BOOL WritePrivateProfileString(
LPCTSTR lpAppName,//指向节名的指针
LPCTSTR lpKeyName,//指向键名的指针
LPCTSTR lpString,//指向要添加的字符串的指针
指向初始化文件名的指针
);
参数描述:
LpAppName:指定节名,一个以null结尾的字符串。如果INI文件中不存在该节名,将创建一个节名。
Lpname:密钥名,一个以空值结尾的字符串。如果INI文件中不存在密钥名,将创建一个密钥名。如果此参数为空,将删除包括节和节在内的所有项目。
LpString:写入键值的数据,是一个以null结尾的字符串。
LP filename:ini文件的名称,一个以null结尾的字符串。指定要写入数据的INI文件。如果指定的INI文件不存在,将会创建它。
返回值:
如果函数成功地将字符串复制到初始化文件中,则返回值非零。
如果函数失败,则刷新最近访问的初始化文件的缓存版本,返回值为零。
2、GetPrivateProfileString
这个函数用于获取INI文件中的键值。
功能原型如下:
DWORD GetPrivateProfileString(
LPCTSTR lpAppName,//指向节名
LPCTSTR lpKeyName,//指向键名
LPCTSTR lpDefault,//指向默认字符串
LPTSTR lpReturnedString,//指向目标缓冲区
DWORD nSize,//目标缓冲区大小
LPCTSTR lpFileName //指向初始化文件名
);
参数描述:
LpAppName:指定节名,一个以null结尾的字符串。如果该参数为空,该函数将把所有的节名复制到指定的缓冲区中。
Lpname:密钥名,一个以空值结尾的字符串。如果该参数为NULL,则该函数将lpAppName部分下的所有键名复制到lpReturnedString缓冲区。
LpDefault:默认值,一个以null结尾的字符串。如果获取的键值的键名不存在,则返回设置的默认值。
LpReturnedString:用于接受数据的缓冲区。
NSize:以字符为单位指示lpReturnedString缓冲区的大小。
LpFileName:INI文件名,一个以null结尾的字符串。
返回值:
复制到缓冲区中的返回值字符数,不包括终止空字符。
3、GetPrivateProfileInt
这个函数用于从INI文件中获取整数数据。
功能原型如下:
UINT GetPrivateProfileInt(LPCTSTR lpAppName,//段名的地址
LPCTSTR lpKeyName,//键名地址
INT nDefault,//如果找不到键名,则返回值
LPCTSTR lpFileName //初始化文件名的地址
);
参数描述:
LpAppName:节名。
LpKeyName:密钥名。
NDefault:默认值。
LpFileName:INI文件名。
返回值:
该函数返回实际读取的整数值。
4、GetPrivateProfileSectionNames
这个函数用于返回INI文件中所有的节名。
功能原型如下:
DWORD GetPrivateProfileSectionNames(
LPTSTR lpszReturnBuffer,//返回缓冲区的地址
DWORD nSize,//返回缓冲区大小
LPCTSTR lpFileName //初始化文件名的地址
);
参数描述:
LpszReturnBuffer:接受节名的数据缓冲区。
NSize:缓冲区的大小。
LpFileName:INI文件名。
返回值:
返回值指定数量的字符复制到指定的缓冲,不包括终止空字符。
如果缓冲区没有大到足以包含所有相关的部分名称指定的初始化文件,返回值等于指定的长度nSize - 2。
5、GetPrivateProfileSection
该函数用于获取指定节下的所有的键名和键值。
函数原型如下:
DWORD GetPrivateProfileSection(
LPCTSTR lpAppName,//段名的地址
LPTSTR lpReturnedString,//返回缓冲区的地址
DWORD nSize,//返回缓冲区大小
LPCTSTR lpFileName //初始化文件名的地址
);
参数说明:
lpAppName:节名。
lpReturnedString:用于接受数据的缓冲区。
nSize:缓冲区的大小。
lpFileName:INI文件名称。
返回值:
返回值指定数量的字符复制到缓冲区,不包括终止空字符。
如果缓冲区没有大到足以包含所有与指定相关联的键名称和值对部分,返回值等于nSize - 2。
四、C++实现INI文件读写完整代码
CMyINI.h
#杂注一次
#包括输入输出流
#包括fstream
#包含流
#包含矢量
#包含cstdlib
#包含地图
使用命名空间标准
//INI文件结点存储结构
节点中的类别
{
公共:
ININode(字符串根,字符串键,字符串值)
{
this-root=root;
this-key=key;
此值=值;
}
字符串根;
字符串键;
字符串值;
};
//键值对结构体
类别子节点
{
公共:
void InsertElement(字符串键,字符串值)
{
sub_node.insert(pairstring,string(key,value));
}
mapstring,字符串子节点
};
//INI文件操作类
CMyINI级
{
公共:
cm伊妮();
~ CMyINI();
公共:
int ReadINI(字符串路径);//读取初始化设置文件的后缀名文件
字符串GetValue(字符串根,字符串键);//由根结点和键获取值
vector in node:size _ type GetSize(){ return map _ ini。size();}//获取初始化设置文件的后缀名文件的结点数
向量ninode:size _ type设置值(字符串根,字符串键,字符串值);//设置根结点和键获取值
int WriteINI(字符串路径);//写入初始化设置文件的后缀名文件
void Clear(){ map _ ini。clear();}//清空
空的旅行();//遍历打印初始化设置文件的后缀名文件
私人:
地图字符串,子节点map_ini .//INI文件内容的存储变量
};
CMyINI.cpp
#include 'StdAfx.h '
#包含" MyINI.h "
#定义INIDEBUG
CMyINI:CMyINI()
{
}
CMyINI:~CMyINI()
{
}
//************************************************************************
//函数名称:TrimString
//访问权限:公共
//创建日期:2017/01/05
//创建人:
//函数说明:去除空格
//函数参数:字符串潜艇用热中子反应堆(submarine thermal reactor的缩写)输入的字符串
//返回值:标准:字符串结果字符串
//************************************************************************
字符串TrimString(字符串str)
{
string:size _ type pos=0;
while (str.npos!=(pos=str.find(')))
str=str.replace(pos,pos 1,' ');
返回字符串;
}
//************************************************************************
//函数名称:ReadINI
//访问权限:公共
//创建日期:2017/01/05
//创建人:
//函数说明:读取初始化设置文件的后缀名文件,并将其保存到地图结构中
//函数参数:字符串帕蒂尼文件的路径
//返回值:int
//************************************************************************
int CMyINI:ReadINI(字符串路径)
{
ifstream in _ conf _ file(路径。c _ str());
如果(!在会议文件中)返回0;
string str _ line=
string str _ root=
向量节点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 _ div _ pos=0;
string str _ key=
字符串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(左_位置1,右_位置1);
}
if (str_line.npos!=(equal _ div _ pos=str _ line。查找('=')))
{
str_key=str_line.substr(0,equal _ div _ pos);
字符串值=字符串行。substr(equal _ div _ pos 1,str _ line。size()-1);
str _ key=修剪字符串(str _ key);
str _ value=修剪字符串(str _ value);
//cout str _ key '=' str _ value endl;
}
如果((!str_root.empty())(!str_key.empty())(!str_value.empty()))
{
in节点ini _ node(str _ root,str_key,str _ value);
vec _ ini。push _ back(ini _节点);
//cout vec _ ini。size()endl;
}
}
在文件中。close();
在文件中。clear();
//矢量转换为地图
地图字符串,字符串map _ tmp
for(vector in node:iterator itr=vec _ ini。begin();itr!=vec _ ini。end();itr)
{
map_tmp.insert(pairstring,string(itr-root,' '));
}//提取出根节点
for (mapstring,string:iterator itr=map _ tmp。begin();itr!=map _ tmp。end();itr)
{
#ifdef INIDEBUG
cout '根节点:' itr-first endl;
#endif//INIDEBUG
子节点序号;
for(vector in node:iterator sub _ itr=vec _ ini。begin();sub_itr!=vec _ ini。end();sub_itr)
{
if (sub_itr-root==itr-first)
{
#ifdef INIDEBUG
cout '键值对:' sub _ itr-key '=' sub _ itr-value endl;
#endif//INIDEBUG
sn .InsertElement(sub_itr-key,sub _ itr-value);
}
}
map_ini.insert(pairstring,SubNode(itr-first,sn));
}
返回1;
}
//************************************************************************
//函数名称:GetValue
//访问权限:公共
//创建日期:2017/01/05
//创建人:
//函数说明:根据给出的根结点和键值查找配置项的值
//函数参数:字符串根配置项的根结点
//函数参数:字符串键配置项的键
//返回值:标准:字符串配置项的值
//************************************************************************
字符串CMyINI:GetValue(字符串根,字符串键)
{
mapstring,SubNode:iterator itr=map _ ini。查找(根);
mapstring,string:iterator sub _ itr=itr-second。子节点。查找(关键);
如果(!(sub _ itr-秒)。empty())
返回sub _ itr-秒;
返回"";
}
//************************************************************************
//函数名称:WriteINI
//访问权限:公共
//创建日期:2017/01/05
//创建人:
//函数说明:保存可扩展标记语言的信息到文件中
//函数参数:字符串帕蒂尼文件的保存路径
//返回值:int
//************************************************************************
int CMyINI:WriteINI(字符串路径)
{
的流输出文件(路径。c _ str());
如果(!out_conf_file)
return-1;
//cout map _ ini。size()endl;
for (mapstring,SubNode:iterator itr=map _ ini。begin();itr!=map _ ini。end();itr)
{
//cout itr-first endl;
out _ conf _ file '[' itr-first ']' endl;
for (mapstring,string:iterator sub _ itr=itr-second。子节点。begin();sub_itr!=itr-秒。子节点。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();
返回1;
}
//************************************************************************
//函数名称:设置值
//访问权限:公共
//创建日期:2017/01/05
//创建人:
//函数说明:设置配置项的值
//函数参数:字符串根配置项的根节点
//函数参数:字符串键配置项的键
//函数参数:字符串值配置项的值
//返回值:std:vectorININode:size_type
//************************************************************************
向量in node:size _ type cm伊妮:SetValue(字符串根,字符串键,字符串值)
{
mapstring,SubNode:iterator itr=map _ ini。查找(根);//查找
if (map_ini.end()!=itr)
{
//itr-秒。子节点。insert(对字符串,字符串(键,值));
一秒钟。sub _ node[key]=值;
}//根节点已经存在了,更新值
其他
{
子节点序号;
sn .插入元素(键,值);
map_ini.insert(pairstring,SubNode(root,sn));
}//根节点不存在,添加值
返回map _ ini。size();
}
//************************************************************************
//函数名称:旅行
//访问权限:公共
//创建日期:2017/01/05
//创建人:
//函数说明:遍历打印初始化设置文件的后缀名文件
//返回值:无效
//************************************************************************
void CMyINI:Travel()
{
for (mapstring,SubNode:iterator itr=this-map _ ini。begin();itr!=this-map _ ini。end();itr)
{
//根
cout '[' itr-first ']' endl;
for(映射字符串,字符串:迭代器it1=itr-秒。子节点。begin());itr1!=itr-秒。子节点。end();
itr1)
{
弯头“ITRI 1-第一”=“ITRI 1-第二结束”;
}
}
}
测试之前ini?初始化设置文件的后缀名文件的内容:
测试程序:
CMyINI *p=新cm yini();
p-readini("设置。ini”);
成本\n原始ini?初始化设置文件的后缀名文件内容* STD:end;
p-travel();
p-SetValue('设置','呵呵,‘呵’);
成本\n增加节点之后的内容* STD:end;
p-travel();
成本\n修改节点之后的内容* STD:end;
p-SetValue('kk ',' kk ',' 2 ');
p-travel();
p-write ini("设置。ini”);
测试结果:
五、C++读写ini文件中的配置信息
ini?初始化设置文件的后缀名文件是由若干个节(sc)组成,每个节又由若干个键(关键点)组成。
1 .{ 1 }将文件写入ini?初始化设置文件的后缀名文件中,主要使用的函数是writeprivate配置文件字符串(lpcwstr ipappname,LPCWSTR IpKeyName,LPCWSTR IpString,LPCWSTR IP ilename);
参数一表示节的名字,参数二表示键的名字,若为空值,则删除整个节,参数三表示键的值,若为空值,则删除这个键,参数四表示文件名。
#ifndef配置文件
# define config _ file(_ t(' config。ini '))
#endif
S7-1200可编程控制器
getmodlefilename(null、IniPath、Max_Path):
tchar * pf id=_ tcsrc HR(inipath,' \ \ ');
if(pf=null)
{
返回;
}
* pf D1=' \ 0 ';
cstring newinipath=inipath
newinipath=' \
newIniPath=CONFIG_FILE:
写入.我.
2 ._将ini?初始化设置文件的后缀名文件中的配置信息读取出来,主要使用的函数为getprivaiteprofile字符串(lpcwstr ipappname、LPCWSTR IpKeyName、LPCWSTR IpDefault、lpcwstr ipreturnedstring、DWORD nSize、lpcwstr ipfilename)和getprivaiteprofile(lpcwstr IP appname,LPCWSTR IpKeyName,Int nDefault,LPCWSTR IP文件名);
GetPrivateProfileString:参数一表示节的名字,参数二表示键的名字,参数三表示如果指定的键名不存在时所默认的读取值,参数四用来接收读取的字符串,参数五指定lpreturnedstring(返回环)指向的缓冲区的大小,参数六表示文件名。
getprivateprofileint:参数一表示节的名字,参数二表示键的名字,参数三表示如果指定的键名不存在时所默认的读取值,参数四表示文件名。
S7-1200可编程控制器:
getmodlefilename(null、IniPath、Max_Path):
inipath[_ tcslen(inipath)-1]=I
inipath[_ tcslen(inipath)-2]=n
inipath[_ tcslen(inipath)-3]=I
如果(!路径文件存在(IniPath)
{}
读取…………………
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。