keep moving
分类: C/C++
2010-07-27 11:51:03
1、概述
ini是微软Windows操作系统中的文件扩展名。这些字母表示初始化。正如该术语所表示的,ini文件被用来对操作系统或特定程序初始化或进行参数设置。
在编写程序时,我们可以使用ini 文件(Profile)来保存少量数据,比如本次程序执行时窗口的位置、大小、一些用户设置的数据等等。
2、ini文件格式
ini 文件是文本文件,文件格式一般为:
[Section1 Name]
KeyName1=value1
KeyName2=value2
...
[Section2 Name]
KeyName1=value1
KeyName2=value2
从上面的文件格式可以看出:ini 文件分为几个 Section,每个 Section 的名称用 [] 括起来;在一个 Section 中,可以有很多的 Key,每一个 Key 可以有一个值并占用一行,格式是 Key=value。
3、ini文件的操作函数
/* 功能:GetPrivateProfileInt - 从 ini 文件的某个 Section 取得一个 key 的整数值
* 参数:
* lpAppName:指向包含 Section 名称的字符串地址
* lpKeyName:指向包含 Key 名称的字符串地址
* INT nDefault:如果 Key 值没有找到,则返回缺省的值是多少
* lpFileName :ini 文件的文件名
* 返回值:
如果 Key 值没有找到的话,返回值是 nDefault 指定的缺省值,如果 Key 中的
值是负数,则返回 0,如果 Key 指定的是数字和字符串的混合,则返回数字部分的值,比如说 x=1234abcd,则返回 1234
*/
UINT GetPrivateProfileInt( LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault, LPCTSTR lpFileName);
/* 功能:GetPrivateProfileString - 从 ini 文件的某个 Section 取得一个 key 的字符串
* 参数:
* lpAppName:指向包含 Section 名称的字符串地址
* lpKeyName:指向包含 Key 名称的字符串地址
* lpDefault:如果 Key 值没有找到,缺省返回缺省的字符串
* lpReturnedString:用于保存返回字符串的缓冲区
* nSize: 缓冲区的长度
* lpFileName :ini 文件的文件名
* 返回值:
返回的字符串在缓冲区lpReturnedString内,返回值是返回的字符串的长度(不包括尾部的\0)
*/
DWORD GetPrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName);
/* 功能:GetPrivateProfileSection - 从 ini 文件中读出整个 Section 的内容
* 参数:
* lpAppName:指向包含 Section 名称的字符串地址
* lpReturnedString:用于保存返回数据的缓冲区
* nSize: 缓冲区的长度
* lpFileName :ini 文件的文件名
* 返回值:
返回的数据在缓冲区内,返回值是返回的数据的长度(不包括尾部的\0)
*/
DWORD GetPrivateProfileSection(LPCTSTR lpAppName, LPTSTR lpReturnedString, DWORD nSize, LPCTSTR lpFileName);
/* 功能:GetPrivateProfileSectionNames - 从 ini 文件中获得 Section 的名称
* 参数:
* lpszReturnBuffer:用于保存返回数据的缓冲区
* nSize: 缓冲区的长度
* lpFileName :ini 文件的文件名
* 返回值:
返回读入缓冲区的字符数
*/
DWORD GetPrivateProfileSectionNames(LPTSTR lpszReturnBuffer, DWORD nSize, LPCTSTR lpFileName);
/* 功能:WritePrivateProfileSection将一个整个 Section 的内容入 ini 文件的指定 Section 中
* 参数:
* lpAppName:指向包含 Section 名称的字符串地址
* lpString:要写入的数据
* lpFileName :ini 文件的文件名
* 返回值:
写入成功返回TRUE;写入失败返回FALSE
*/
BOOL WritePrivateProfileSection(LPCTSTR lpAppName, LPCTSTR lpString, LPCTSTR lpFileName);
/* 功能:WritePrivateProfileString - 将一个 Key 值写入 ini 文件的指定 Section 中
* 参数:
* lpAppName:指向包含 Section 名称的字符串地址
* lpKeyName:指向包含 Key 名称的字符串地址
* lpString:要写入的字符串
* lpFileName :ini 文件的文件名
* 返回值:
写入成功返回TRUE;写入失败返回FALSE
*/
BOOL WritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileName);
如果 ini 中没有指定的 Section,API 会新建 Section,如果没有指定的 Key 则新建一个 Key 并写入数据,如果已经存在,则用字符串代替原来的值。当指定的 ini 也不存在的时候,API 会自动建立一个新的文件,所以使用 ini 的好处是我们不必为了保存少量的数据涉及到文件操作,就连查找文件是否存在的操作都不必要。
使用要点:
在我们实际使用的时候,用的最多的是 GetPrivateProfileString 和 WritePrivateProfileString,但在对自定义 ini 文件操作的时候要注意的是:
1、ini文件的路径必须完整,文件名前面的各级目录必须存在。如果 lpFileName 指定的文件没有路径的话,api 会去 Windows 的安装目录去找而不会在当前目录找;
2、文件名的路径中必须为 \\ ,因为在VC++中,\\
才表示一个 \ ;
3、.\表示当前目录。如果ini文件放在程序所在目录中(即当前目录中),你只要在 ini 文件名前面加上 .\ 就可以了,比如说要操作当前目录下的 user.ini,那么文件名就是".\\user.ini";
4、要把一个 Key 清除时,可以使用WritePrivateProfileString向该Key写个空字符串。当你要把一个section的全部内容清空的时候,也不必把 key 一个个的清除,可以使用WritePrivateProfileSection向该Section写个空字符串。
另外,还有一组api专门用于操作win.ini文件。这组API与上面的很像,只要把上面一组的PrivateProfile 换成就可以了,参数中也相应的少了一个 ini 文件名的参数。
UINT GetProfileInt(LPCTSTR lpAppName, LPCTSTR lpKeyName, INT nDefault );
DWORD GetProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize);
GetProfileSection(LPCTSTR lpAppName, LPTSTR lpReturnedString, DWORD nSize);
BOOL WriteProfileSection(LPCTSTR lpAppName, LPCTSTR lpString);
BOOL WriteProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString);
win.in 和 system.ini 是Windows的两个非常重要的初始化文件,Windows将用户所作的选择以及各种变化的系统信息记录在这两个文件中。System.ini 描述了系统硬件的当前状态,Win.ini 文件则包含了Windows 系统运行环境的当前配置。
参考文献: