Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1522734
  • 博文数量: 226
  • 博客积分: 3997
  • 博客等级: 少校
  • 技术积分: 2369
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-19 17:26
个人简介

Never save something for a special occasion. Every day in your life is a special occasion.

文章分类

全部博文(226)

文章存档

2018年(5)

2017年(11)

2016年(1)

2015年(17)

2014年(14)

2013年(30)

2012年(5)

2011年(52)

2010年(107)

分类: 项目管理

2010-08-08 11:13:50

程序设计中,经常需要把一些数据先期导入到程序中进行初始化。如果你可以把数据写入ini文件,程序去读ini文件中的数据进行初始化。

 

一. INI简介

那么什么是ini文件呢?ini文件是Initialization file的缩写,意即初始化文件。

其实windows操作系统也有自己的ini文件--win.ini,保存在%WinDir%\system32目录下。Windows通过该文件对当前操作系统进行配置。

 

ini文件里的数据的存取是采取的是预先约定好的 “项-值”存储结构,各种数据被分门别类的存储。

形式:

; comment
[Section]
Key=KeyValue


以下是win.ini 文件的部分内容

 [Mail]
MAPI=1
CMC=1
CMCDLLNAME=mapi.dll
CMCDLLNAME32=mapi32.dll
MAPIX=1
MAPIXVER=1.0.0.1
OLEMessaging=1

二.操作ini文件的API

windows SDK提供有两组API对ini文件进行读写。
第一组(表2)

 

GetPrivateProfileInt

GetPrivateProfileString
GetPrivateProfileSection
GetPrivateProfileSectionNames
GetPrivateProfileStruct

WritePrivateProfileString
WritePrivateProfileSection
WritePrivateProfileStruct


二组(表3)

 

GetProfileInt

GetProfileString
GetProfileSection

WriteProfileString

WritePrivateProfileSection


2的函数一般用于用户的配置文件。

表3的函数则是用于系统配置文件,即win.ini进行操作的函数。

现只介绍常用的表2中的函数,表3中的函数类同。

先看函数的功能:

DWORD GetPrivateProfileString(
LPCTSTR lpAppName, //节名,即Section
LPCTSTR lpKeyName, //项名,即Key
LPCTSTR lpDefault, //缺省返回字符串。如lpKeyName未找到,拷贝lpDefault到lpReturnedString
LPTSTR lpReturnedString, //返回字符串的缓冲地址
DWORD nSize, //缓冲大小
LPCTSTR lpFileName //ini文件路径
);

功能:根据指定的Section和 Key得到KeyValue,存放在lpReturnedString中
返回:返回拷贝到缓冲中的字符个数。不包括结束符

UINT GetPrivateProfileInt(
LPCTSTR lpAppName, //节名,即Section
LPCTSTR lpKeyName, //项名,即Key
INT nDefault, //缺省返回整型值。如lpKeyName未找到,函数返回nDefault的值
LPCTSTR lpFileName //ini文件路径
);

功能:根据指定的Section和 Key得到整型KeyValue
返回:返回得到的整型KeyValue

BOOL WritePrivateProfileString(
LPCTSTR lpAppName, //节名,即Section
LPCTSTR lpKeyName, //项名,即Key
LPCTSTR lpString, //要写入的字符串
LPCTSTR lpFileName //ini文件路径
);

功能:向指定的Section和 Key写入KeyValue。
如果lpString为NULL,则删除当前lpKeyName
如果lpKeyName=lpString=NULL,则删除当前Section以及其下的所有Key
如果Section或者Key不存在,则创建;存在则覆盖
返回:写入成功。


DWORD GetPrivateProfileSectionNames(
LPTSTR lpszReturnBuffer, //存放所有Section的缓冲地址
DWORD nSize, //缓冲大小
LPCTSTR lpFileName //ini文件路径
);

功能:得到ini文件中所有Section名。
返回:返回拷贝到缓冲中的字符个数。不包括结束符。
注意:返回的所有Section在缓冲中的存放格式为“Section1”,0,“Section2”,0 ...
若需要得到具体的每个Section,则需要进行字符串解析。在后面的IniFile类中的GetAllKeysAndValues函数中会看到解析步骤。


DWORD GetPrivateProfileSection(
LPCTSTR lpAppName, //节名,即Section
LPTSTR lpReturnedString, //存放指定Section下所有的Key和KeyValue的缓冲地址
DWORD nSize, //缓冲大小
LPCTSTR lpFileName //ini文件路径
);

功能:得到指定Section下所有的Key和KeyValue。
返回:返回拷贝到缓冲中的字符个数。不包括结束符。
注意:返回的“项-值”对在缓冲中的存放格式为“Key1=KeyValue1”,0,“Key2=KeyValue2”,0 ...
若需要得到具体的Key和KeyValue,则需要进行字符串解析。在后面的IniFile类中的GetAllKeysAndValues函数中会看到解析步骤。

GetPrivateProfileStruct和WritePrivateProfileStruct用的较少,介绍,感兴趣的去查MSDN。

 

三、类实现 (MFC)

//////////////////////////////////////////////////////////////////////////
// File: IniFile.h
// Date: October 2004
// Author: lixiaosan
// Email: airforcetwo@163.com
// Copyright (c) 2004. All Rights Reserved.
//
// windows SDK提供有两组API对ini文件进行读写。
// 第一组为常用,操作用户ini文件。第二组用于操作win.ini 文件,用法类同。
// 为了更方便操作ini ,这里对第一组api 进行封装,将接口简化。
//////////////////////////////////////////////////////////////////////////

#if !defined(AFX_INIFILE_H__B5C0D7F7_8353_4C93_AAA4_38A688CA253C__INCLUDED_)
#define AFX_INIFILE_H__B5C0D7F7_8353_4C93_AAA4_38A688CA253C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif
// _MSC_VER > 1000

class CIniFile{
public:
    CIniFile();
    virtual ~CIniFile();
// 设置ini文件路径
// 成功返回TRUE;否则返回FALSE
BOOL SetPath(CString strPath);

// 检查section是否存在
// 存在返回TRUE;否则返回FALSE
BOOL SectionExist(CString strSection);

// 从指定的Section和Key读取KeyValue
// 返回KeyValue
CString GetKeyValue(CString strSection,CString strKey);

// 设置Section、Key以及KeyValue,若Section或者Key不存在则创建
void SetKeyValue(CString strSection,CString strKey,CString strKeyValue);

// 删除指定Section下的一个Key
void DeleteKey(CString strSection,CString strKey);

// 删除指定的Section以及其下的所有Key
void DeleteSection(CString strSection);

// 获得所有的Section
// 返回Section数目
int GetAllSections(CStringArray& strArrSection);

// 根据指定Section得到其下的所有Key和KeyValue
// 返回Key的数目
int GetAllKeysAndValues(CString strSection,CStringArray& strArrKey,CStringArray& strArrKeyValue);

// 删除所有Section
void DeleteAllSections();

private:
// ini文件路径
CString m_strPath;
};

#endif
// !defined(AFX_INIFILE_H__B5C0D7F7_8353_4C93_AAA4_38A688CA253C__INCLUDED_)


函数实现 见原作者

 

 

/*
测试:
比如在存在一个myfile.ini文件,内容如下:
[student]
number=40
male=25
female=15
average_age=15

[computer]
cpu=2.0
motherboard=ASU
Sharddisk=120
ram=512
display=sansung

新建MFC工程MyIniFileDemo,对话框类型。在界面添加一个测试按钮。
现在把IniFile.h和IniFile.cpp 加入到你的工程中。在使用他的类中#include “IniFile.h”;

设置观察断点,以便观察程序过程。

执行程序前,记得把 myfile.ini 复制到工程目录中。
*/


// 测试按钮的响应代码如下:
void CMyIniFileDemoDlg::OnbtnTest()
{
    CIniFile file;
    CStringArray arrSection, arrKey, arrkeyValue;

    if(!file.SetPath(".\\myfile.ini"))
        MessageBox("SetPath失败,找不到myfile.ini文件", "", MB_OK);

    CString str="";
    if(!file.SectionExist("student"))
        MessageBox("无小节[student]", "", MB_OK);

    str = file.GetKeyValue("student", "female");

    
//设置number为50

    file.SetKeyValue("student", "number", "50");

    
//因为在student中computer_num不存在,所以增加一项

    file.SetKeyValue("student", "computer_num", "30");

    
//得到所有section

    int num = file.GetAllSections(arrSection);
    str = "";
    for(int i=0; i<num; i++)
    {
        str += arrSection[i] + " ";
        
//str="student computer ";

    }

    
//得到所有Key和KeyValue

    num = file.GetAllKeysAndValues("computer", arrKey, arrkeyValue);
    str = "";
    for(int j=0; j<num; j++)
    {
        
//arrKey保存了computer下所有的Key

        
//arrkeyValue保存了computer下所有的KeyValue

        str = arrKey[j];
        str = arrkeyValue[j];
    }

    
//删除student下的computer_num

    file.DeleteKey("student", "computer_num");

    
//删除student

    file.DeleteSection("student");
}


阅读(3353) | 评论(0) | 转发(0) |
0

上一篇:没有找到MFC42D.DLL

下一篇:DOS符号参考

给主人留下些什么吧!~~