ini配置文件读写操作入门
2017-01-02 16:38
274 查看
ini配置文件读写操作入门
ini文件(Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值,而这只要借助几个函数即可完成。
ini 文件是文本文件,中间的数据格式一般为:
[Section1 Name]
KeyName1=value1KeyName2=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系统的地位就开始不断下滑,这是因为注册表的独特优点,使应用程序和系统都把许多参数和初始化信息放进了注册表中。
相关文章推荐
- Delphi TIniFile 类 操作ini配置文件
- C# 操作ini配置文件帮助类
- 配置文件INI的操作
- 使用API函数操作ini配置文件
- PHP获取和操作配置文件php.ini的几个函数
- ACE操作ini配置文件
- IniFile.cs:C#来操作ini配置文件
- 配置文件INI的操作
- C#常用操作类库二(ini配置文件读写)
- Python核心编程中题目(解析操作Ini配置文件)
- 使用Windows API操作配置(.ini)文件
- 程序配置文件(*.ini)的操作
- Delphi TIniFile 类 操作ini配置文件
- bash 脚本实现的配置文件(ini/inc.sh)的读写操作
- VC++操作INI配置文件的实现
- Delphi TIniFile 类 操作ini配置文件
- C# 关于 ini 配置文件的操作
- MFC操作ini配置文件
- C# 操作INI配置文件
- Delphi TIniFile 类 操作ini配置文件