您的位置:首页 > 其它

ini配置文件读写操作入门

2017-01-02 16:38 274 查看

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系统的地位就开始不断下滑,这是因为注册表的独特优点,使应用程序和系统都把许多参数和初始化信息放进了注册表中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: