C++ ini

本文介绍如何使用Windows API函数进行INI文件的读写操作。包括将字符串和整数写入INI文件,从INI文件读取字符串和整数,以及循环写入多个值的方法。

具体应用如下:

  一.将信息写入.INI文件中.

  1.所用的WINAPI函数原型为:

C/C++ code
BOOL WritePrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpString,
LPCTSTR lpFileName
);



  其中各参数的意义:

   LPCTSTR lpAppName 是INI文件中的一个字段名.

   LPCTSTR lpKeyName 是lpAppName下的一个键名,通俗讲就是变量名.

   LPCTSTR lpString 是键值,也就是变量的值,不过必须为LPCTSTR型或CString型的.

   LPCTSTR lpFileName 是完整的INI文件名.

  2.具体使用方法:设现有一名学生,需把他的姓名和年龄写入 c:/stud/student.ini 文件中.

C/C++ code
CString strName,strTemp;
int nAge;
strName="张三";
nAge=12;
::WritePrivateProfileString("StudentInfo","Name",strName,"c://stud//student.ini");


  此时c:/stud/student.ini文件中的内容如下:

   [StudentInfo]
   

  3.要将学生的年龄保存下来,只需将整型的值变为字符型即可:

C/C++ code
strTemp.Format("%d",nAge);
::WritePrivateProfileString("StudentInfo","Age",strTemp,"c://stud//student.ini");


二.将信息从INI文件中读入程序中的变量.

  1.所用的WINAPI函数原型为:

C/C++ code
DWORD GetPrivateProfileString(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
LPCTSTR lpDefault,
LPTSTR lpReturnedString,
DWORD nSize,
LPCTSTR lpFileName
);



  其中各参数的意义:

   前二个参数与 WritePrivateProfileString中的意义一样.

   lpDefault : 如果INI文件中没有前两个参数指定的字段名或键名,则将此值赋给变量.

   lpReturnedString : 接收INI文件中的值的CString对象,即目的缓存器.

   nSize : 目的缓存器的大小.

   lpFileName : 是完整的INI文件名.

  2.具体使用方法:现要将上一步中写入的学生的信息读入程序中.

C/C++ code
CString strStudName;
int nStudAge;
GetPrivateProfileString("StudentInfo","Name","默认姓名",strStudName.GetBuffer(MAX_PATH),MAX_PATH,"c://stud//student.ini");


  执行后 strStudName 的值为:"张三",若前两个参数有误,其值为:"默认姓名".

  3.读入整型值要用另一个WINAPI函数:

C/C++ code
UINT GetPrivateProfileInt(
LPCTSTR lpAppName,
LPCTSTR lpKeyName,
INT nDefault,
LPCTSTR lpFileName
);



  这里的参数意义与上相同.使用方法如下:

C/C++ code
nStudAge=GetPrivateProfileInt("StudentInfo","Age",10,"c://stud//student.ini");



三.循环写入多个值,设现有一程序,要将最近使用的几个文件名保存下来,具体程序如下:

  1.写入:

C/C++ code
CString strTemp,strTempA;
int i;
int nCount=6;
file://共有6个文件名需要保存
for(i=0;i {strTemp.Format("%d",i);
strTempA=文件名;
file://文件名可以从数组,列表框等处取得.
::WritePrivateProfileString("UseFileName","FileName"+strTemp,strTempA,
"c://usefile//usefile.ini");
}
strTemp.Format("%d",nCount);
::WritePrivateProfileString("FileCount","Count",strTemp,"c://usefile//usefile.ini");


file://将文件总数写入,以便读出.

  2.读出:
C/C++ code

nCount=::GetPrivateProfileInt("FileCount","Count",0,"c://usefile//usefile.ini");
for(i=0;i {strTemp.Format("%d",i);
strTemp="FileName"+strTemp;
::GetPrivateProfileString("CurrentIni",strTemp,"default.fil", strTempA.GetBuffer(MAX_PATH),MAX_PATH,"c://usefile//usefile.ini");



file://使用strTempA中的内容.

}

  补充四点:

   1.INI文件的路径必须完整,文件名前面的各级目录必须存在,否则写入不成功,该函数返回 FALSE 值.

   2.文件名的路径中必须为 // ,因为在VC++中, // 才表示一个 / .

   3.也可将INI文件放在程序所在目录,此时 lpFileName 参数为: ".//student.ini".

<think>好的,我现在需要帮用户推荐一个C++INI文件解析库。用户已经给出了一些引用资料,我需要仔细分析这些引用,然后综合出一个合适的回答。 首先,用户提供的引用有5个,分别介绍了不同的库和方法。引用1提到了inifile-cpp,引用3推荐了IniH,引用5提到了inifile库,还有引用2和4讨论了通用的解析方法。我需要确定每个库的特点和优势,然后进行比较。 引用1的inifile-cpp安装配置指南,看起来是一个具体的库,用户需要包含头文件,使用IniFile类来加载和操作INI文件。这个库的示例代码看起来简单,可能适合快速上手。 引用3的IniH被描述为头文件-only,轻量,适合嵌入式或对体积有要求的项目,兼容Python的ConfigParser格式,支持多行语法。这点很重要,特别是如果用户需要处理复杂的INI格式,这个库可能更适合。 引用5提到的inifile库使用分号作为注释,并且展示了INI的结构,可能这个库的语法解析比较传统,适合标准格式。 引用2和4则讨论了如何用C++解析INI,引用4甚至给出了makefile的例子,但用户更倾向于使用现有库而不是自己写解析代码,所以重点还是推荐现有的库。 接下来需要评估哪个库更受欢迎或更易用。根据引用中的信息,IniH是头文件-only,这对于集成到项目里非常方便,无需编译库文件,直接包含即可。而inifile-cpp和inifile可能也需要类似的方式,但需要查看具体细节。 用户可能需要考虑的因素包括:易用性、轻量性、功能支持(如多行、注释处理等)、社区支持等。IniH支持多行语法,这在处理较复杂的配置时可能更有优势。inifile-cpp的示例代码看起来也很简洁,适合快速开始。 另外,引用5提到的inifile库可能是一个选项,但用户引用中没有详细说明它的使用方式,可能不如前两者明确。需要确认是否有足够的文档和活跃度。 现在需要整理这些信息,给出推荐,并说明每个库的特点,让用户根据需求选择。可能的结构是先列出推荐的库,每个库分点说明特点,然后比较它们的适用场景,最后给出建议。 还需要注意用户提到的引用,比如在回答中正确添加引用标识,例如[^1]、[^3]等。同时,用户希望生成相关问题,需要根据内容设计相关问题,比如如何选择不同库、如何集成等。 最后,确保回答符合系统级指令:行内公式用$,独立公式用$$,但这个问题可能不需要数学公式,所以可能不需要处理这部分。语法正确,使用中文,结构清晰。</think>以下是针对C++ INI文件解析库的推荐与分析,结合技术特性和应用场景进行说明: --- ### **推荐解析库及特点对比** 1. **inifile-cpp** - 特点: - 提供完整的`IniFile`类,支持文件加载、解析和修改操作[^1] - 支持链式操作,例如`ini["Section"]["Key"] = Value` - 需包含头文件`inicpp.h`,集成简单 - 代码示例: ```cpp #include <inicpp/h> int main() { ini::IniFile ini; ini.decode("config.ini"); // 加载文件 std::string value = ini["Database"]["Host"].as<std::string>(); return 0; } ``` - 适用场景:**需要直接操作INI文件且追求代码简洁性的项目** 2. **IniH** - 特点: - 头文件-only设计,无外部依赖,适合嵌入式系统[^3] - 兼容Python的`ConfigParser`格式,支持多行语法(RFC 822标准) - 轻量级(仅一个头文件),解析效率高 - 示例代码: ```cpp #include "inih.h" int main() { INIReader reader("config.ini"); std::string port = reader.Get("Server", "Port", "8080"); return 0; } ``` - 适用场景:**资源受限环境或需要多行配置解析的项目** 3. **inifile(第三方库)** - 特点: - 支持标准INI格式(键值对与分号注释)[^5] - 提供跨平台兼容性 - 使用示例: ```cpp #include "inifile.h" inifile::IniFile ini; ini.load("settings.ini"); std::string mode = ini.getString("System", "Mode"); ``` - 适用场景:**传统INI格式解析需求** --- ### **选型建议** - **优先轻量级** → 选择**IniH** - **需复杂操作** → 选择**inifile-cpp** - **标准格式解析** → 选择**inifile** --- ### **集成注意事项** 1. **编译配置** 若使用需要编译的库(如inifile-cpp),需在Makefile中添加头文件路径: ```makefile INCS=-I./include # 头文件目录 LIBS=-L./lib -linicpp # 链接库路径(如适用) ``` [^4] 2. **多平台支持** 确保库的编码兼容性(如UTF-8),避免Windows/Linux换行符差异问题[^2] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值