ini配置文件读写操作入门

本文介绍了如何使用Win32 API进行INI配置文件的读写操作,包括对win.ini和system.ini的标准操作,以及对自定义INI文件的读写。文中还提供了示例代码,展示了如何创建、读取和写入INI文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ini配置文件读写操作入门

        ini文件(Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。

ini 文件是文本文件,中间的数据格式一般为: 

[Section1 Name] 

KeyName1=value1 
KeyName2=value2 
...

[Section2 Name] 
KeyName1=value1 
KeyName2=value2

Win32 对 ini 文件操作的API中,有一部分是对 win.ini和system.ini 操作的,有一部分是对用户自定义的 ini 文件操作的。


一、对win.ini和system.ini的操作

      Win.in 和 system.ini 是Windows的两个非常重要的初始化文件,Windows将用户所作的选择以及各种变化的系统信息记录在这两个文件中。System.ini 描述了系统硬件的当前状态,Win.ini 文件则包含了Windows 系统运行环境的当前配置。由于 Win.ini 文件的重要性和常用性,Win32 中有专门对 Win.ini 进行操作的 API。

它们是:

1)GetProfileInt - 从 Win.ini 文件的某个 Section 取得一个 key 的整数值。

2)GetProfileString - 从 Win.ini 文件的某个 Section 取得一个 key 的字符串。

3)GetProfileSection - 从 Win.ini 文件中读出整个Section 的内容。

4)WriteProfileSection - 将一个整个 Section 的值写入Win.ini 文件的指定的Section 中.

5)WriteProfileString - 将一个 Key 值写入 Win.ini 文件的指定 Section 中。

      如果 Win.ini 没有指定的 Section,API 会新建 Section,如果没有指定的 Key 则新建一个 Key 并写入数据,如果已经存在,则用字符串代替原来的值。相应API接口函数的原型可以在网上查阅相关博客了解其使用情况。


二、对自定义ini文件的操作

      以上的 API是对操作系统的文件 Win.ini和system.ini的操作,当然对于我们来说,用的更多的是在程序运行的目录中建立自己的ini 文件,如果需要对自己的ini 文件操作,就要用到另一组API,这一组API和上面的类似,只要把上面一组的 Profile 换成 PrivateProfile(私有的)就可以了,参数中也相应的多了一个 ini 文件名的参数。例如 GetPrivateProfileInt、GetPrivateProfileString ,WritePrivateProfileString 等等。这里着重的介绍一下这三个API函数的原型及用法。


三、配置文件路径问题

      在对ini文件进行读写时,文件可以使相对路径或者绝对路径,用户可根据自己的需要进行选择。下面说一下相对路径和绝对路径的格式:


1)  ".\\IniFileName.ini"    // 这样的为相对路径
2) "D:\\IniFileName.ini"    // 这样的为绝对路径

       需要注意的是,C系列的语言中,转义字符'\\'表示反斜线'\'。另外,当使用相对路径时,\\前的.号不能丢掉了。

四、ini文件操作示例

1.不采用Cstring存取字符串形式

#include <iostream>  
#include <windows.h>//这个头文件一定要添加,否则GetPrivateProfileString(...)函数无法使用  
#include  "shlwapi.h" 
#pragma comment(lib, "Shlwapi")//这两个文件用于!PathFileExists函数的正常使用
int main() 
{

#ifndef CONFIG_FILE
#define CONFIG_FILE  TEXT(".\\CONFIG.ini")
	//保存的ini文件放在根目录下,不能直接保存为“CONFIG.ini”
#endif
	WritePrivateProfileString(TEXT("Teacher"), TEXT("Name"), TEXT("brother Dong "), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Teacher"), TEXT("Age"), TEXT("100"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name1"), TEXT("Alex"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age1"), TEXT("23"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name2"), TEXT("Lauretta"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age2"), TEXT("21"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name3"), TEXT("Dudiu"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age3"), TEXT("21"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Others"), TEXT("Name"), TEXT("Boby"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Others"), TEXT("Age"), TEXT("12"), CONFIG_FILE);
	TCHAR szKeyValue[MAX_PATH] = { 0 };
	if (!PathFileExists(TEXT(".\\CONFIG.ini")))//判断文件是否存在
	{
		printf("ERROR");
	}
	GetPrivateProfileString(TEXT("Teacher"), TEXT("Name"), 
		TEXT("ERROR"), szKeyValue, MAX_PATH, TEXT(".\\CONFIG.ini"));//获取为字符串的键值
	printf("szKeyValue=%S\n", szKeyValue);
	int nValue = GetPrivateProfileInt(TEXT("Others"), TEXT("Age"), 0, TEXT(".\\CONFIG.ini"));//获取为整型的键值
	printf("nvalue=%d\n", nValue);
	return 0;
}

2.采用Cstring存取字符串形式

#include <iostream>  
#include <windows.h>//这个头文件一定要添加,否则GetPrivateProfileString(...)函数无法使用  
#include  "shlwapi.h" 
#include<atlstr.h>//记得包含该头文件,否则Cstring显示未定义标识符
#pragma comment(lib, "Shlwapi")//这两个文件用于!PathFileExists函数的正常使用
int main() 
{
#ifndef CONFIG_FILE
#define CONFIG_FILE  TEXT(".\\CONFIG.ini")//保存的ini文件放在根目录下,不能直接保存为“CONFIG.ini”
#endif

	WritePrivateProfileString(TEXT("Teacher"), TEXT("Name"), TEXT("brother Dong "), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Teacher"), TEXT("Age"), TEXT("100"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name1"), TEXT("Alex"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age1"), TEXT("23"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name2"), TEXT("Lauretta"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age2"), TEXT("21"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Name3"), TEXT("Dudiu"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Student"), TEXT("Age3"), TEXT("21"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Others"), TEXT("Name"), TEXT("Boby"), CONFIG_FILE);
	WritePrivateProfileString(TEXT("Others"), TEXT("Age"), TEXT("12"), CONFIG_FILE);
	if (!PathFileExists(TEXT(".\\CONFIG.ini")))
	{
		printf("ERROR");
	}
	
	CString szKeyValue;
	GetPrivateProfileString(TEXT("Teacher"), TEXT("Name"), TEXT("Error"), szKeyValue.GetBuffer(20), 20, TEXT(".\\CONFIG.ini"));
	//字符串输出方式1
	std::wcout << "szKeyValue = "<<szKeyValue.GetBuffer(0) << std::endl;
	//字符串输出方式2
	//printf("szKeyValue=%S\n", szKeyValue);
	int nValue = GetPrivateProfileInt(TEXT("Others"), TEXT("Age"), 0, TEXT(".\\CONFIG.ini"));
	printf("nvalue=%d\n", nValue);
	return 0;
}

五、注意事项

      1.读取INI时,会先从头找Section,找到后即在此Section中查找Key,要是在这个Section找不到此Key的话,即认为此Key不存在,即便此后还有同名的Section-Key定义。比如下面这个具体的例子里,使用GetPrivateProfileString则永远无法成功读取到Section1Key2。
  [Section1]
   Section1Key1=???
  [Section2]
   Section2Key1=???
  [Section1]
   Section1Key2=???    //× 永远无法找到它

     2.在非MFC下使用Cstring会导致Cstring显示为“为声明的标识符”,有如下解决办法:

1)如果你使用VC.NET,那么使用MFC,应包含:#include<cstringt.h>或者#include<afx.h>

2)不适用MFC,应包含#include<atlstr.h>

     最后想说的是,在Windows系统中,ini文件是很多,最重要的就是“System.ini”、“System32.ini”和“Win.ini”。该文件主要存放用户所做的选择以及系统的各种参数。用户可以通过修改ini文件,来改变应用程序和系统的很多配置。但自从Windows 95的退出,在Windows系统中引入了注册表的概念,ini文件在Windows系统的地位就开始不断下滑,这是因为注册表的独特优点,使应用程序和系统都把许多参数和初始化信息放进了注册表中。

纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、跨平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号中可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值