ini文件(即Initialization file),这种类型的文件中通常存放的是一个程序的初始化信息。ini文件由若干个节(Section)组成,每个Section由若干键(Key)组成,每个Key可以赋相应的值。读写ini文件实际上就是读写某个的Section中相应的Key的值。
这里的配置文件叫automoto.ini
1.函数说明
从自己的配置文件automoto.ini中读取字符串,需要调用GetPrivateProfileString()函数,在Unicode模式下该函数定义如下:
GetPrivateProfileStringW(
__in_opt LPCWSTR lpAppName,
__in_opt LPCWSTR lpKeyName,
__in_opt LPCWSTR lpDefault,
__out_ecount_part_opt(nSize, return + 1) LPWSTR lpReturnedString,
__in DWORD nSize,
__in_opt LPCWSTR lpFileName
);
lpAppName: section(节)的名字,是一个以0结束的字符串
lpKeyName:key键的名字,是一个以0结束的字符串
lpDefault:若指定的键不存在,该值作为读取的默认值
lpReturnedString:一个指向缓冲区的指针,接收读取的字符串
nSize:指定lpReturnedString指向的缓冲区的大小
lpFileName:读取信息的文件名。若该ini文件与程序在同一个目录下,也可使用相对路径,否则需要给出绝度路径
从自己的配置文件automoto.ini读取整数,调用GetPrivateProfileInt()函数,Unicode模式下该函数定义为:
GetPrivateProfileIntW(
__in LPCWSTR lpAppName,
__in LPCWSTR lpKeyName,
__in INT nDefault,
__in_opt LPCWSTR lpFileName
);
参数含义同上一个函数一样。
2.定义宏,减少代码工作量
// int参数声明
#define IntParamDeclare(name) \
private:\
int m_i##name;\
public:\
int Get##name() const;\
void Set##name(int value);\
// int参数实现
#define IntParamImplement(classname, name) \
int classname##::Get##name() const \
{\
return m_i##name;\
}\
void classname##::Set##name(int value)\
{\
m_i##name = value;\
}
// int参数读取
#define LoadIntParam(group, name, v) \
m_i##name = GetPrivateProfileInt(_T(#group), _T(#name), (v), szParamPath)
// double参数声明
#define DoubleParamDeclare(name) \
private:\
double m_db##name;\
public:\
double Get##name() const;\
void Set##name(double value);\
// Double参数实现
#define DoubleParamImplement(classname, name) \
double classname##::Get##name() const \
{\
return m_db##name;\
}\
void classname##::Set##name(double value)\
{\
m_db##name = value;\
}
// Double参数读取
#define LoadDoubleParam(group, name, v, buf, len) \
GetPrivateProfileString(_T(#group), _T(#name), _T(#v), buf, (len), szParamPath);\
m_db##name = _tstof(buf)
// string参数声明
#define StringParamDeclare(name) \
private:\
std::wstring m_str##name;\
public:\
std::wstring Get##name() const;\
void Set##name(std::wstring value);\
// string参数实现
#define StringParamImplement(classname, name) \
std::wstring classname##::Get##name() const \
{\
return m_str##name;\
}\
void classname##::Set##name(std::wstring value)\
{\
m_str##name = value;\
}
有了宏之后,添加配置变了就会变得很简单
int型变量:
//头文件中
IntParamDeclare(AnteriorOP)
//加载参数时调用
LoadIntParam(Param, AnteriorOP, 200);
//实现变量获取和设置
IntParamImplement(CAutoMotoParam, AnteriorOP)
double型变量:
//头文件中
DoubleParamDeclare(RefractionThreshold)
//加载参数时调用
LoadDoubleParam(Param, RefractionThreshold, 7.0, sz, len);
//实现变量获取和设置
DoubleParamImplement(CAutoMotoParam, RefractionThreshold)
3.无法读取automoto.ini文件中值解决
如果automoto.ini文件保存不是ANSI编码,就不能读取文件中的值,每次只能获取到加载时的默认值。
即使automoto.ini文件中变量的值已经改变,依旧也是默认值。
ANSI编码可以用,但最好使用unicode编码,因为中文很容易导致错误。
4.automoto实现案例
automoto.ini文件:
[param]
;电机初始速度
initialZSpeed = 99
;Z电机复位的位置pos
RESET_Z = 100000
;OP电机复位的位置pos
RESET_OP = 52530
;X电机复位到左眼
RESET_X_LEFT = 1256
;X电机复位到右眼
RESET_X_RIGHT = 47000
;Y电机复位到默认位置
RESET_Y = 32600
读取auto.ini文件
*.h
#pragma once
class CAutoMotoParam
{
public:
CAutoMotoParam(void);
~CAutoMotoParam(void);
private:
static CAutoMotoParam *Instance;
//Z电机初始速度,默认值99
int m_initialZSpeed;
//Z电机复位的位置pos
int m_reset_z;
//Y电机复位到默认位置
int m_reset_y;
//X电机复位到左眼
int m_reset_xleft;
//光程电机复位的位置pos
int m_reset_op;
//X电机复位到右眼
int m_reset_xright;
private:
void LoadAutoMotoParam();
public:
static CAutoMotoParam * GetInstance();
int GetInitialZSpeed();
void SetInitialZSpeed(int zspeed);
int GetResetZ();
void SetResetZ(int zpos);
int GetResetY();
void SetResetY(int ypos);
IntParamDeclare(STOP_BIGDUIJIAO)
};
*.cpp
#include "StdAfx.h"
#include "AutoMotoParam.h"
#include "../../UtilityObject.h"
CAutoMotoParam * CAutoMotoParam::Instance = NULL;
CAutoMotoParam::CAutoMotoParam(void)
{
LoadAutoMotoParam();
}
CAutoMotoParam::~CAutoMotoParam(void)
{
if(Instance != NULL)
{
delete Instance;
Instance = NULL;
}
}
CAutoMotoParam * CAutoMotoParam::GetInstance()
{
if (Instance == NULL)
{
Instance = new CAutoMotoParam();
}
return Instance;
}
void CAutoMotoParam::LoadAutoMotoParam()
{
CString szParamPath;
szParamPath = CUtilityObject::GetInstance()->Directory.GetCurrentPath();
szParamPath += _T("automoto.ini");
TCHAR sz[512] = { 0 };
int len = 512;
//Z电机初始速度
m_initialZSpeed = GetPrivateProfileInt(_T("Param"), _T("initialZSpeed"), 99, szParamPath);
//Z电机复位的位置pos
m_reset_z = GetPrivateProfileInt(_T("Param"), _T("RESET_Z"), 100000, szParamPath);
//Y电机复位到默认位置
m_reset_y= GetPrivateProfileInt(_T("Param"), _T("RESET_Y"), 32600, szParamPath);
LoadIntParam(Param, STOP_BIGDUIJIAO, 50000);
}
int CAutoMotoParam::GetInitialZSpeed()
{
return m_initialZSpeed;
}
void CAutoMotoParam::SetInitialZSpeed(int zspeed)
{
m_initialZSpeed=zspeed;
}
int CAutoMotoParam::GetResetZ()
{
return m_reset_z;
}
void CAutoMotoParam::SetResetZ(int zpos)
{
m_reset_z=zpos;
}
int CAutoMotoParam::GetResetY()
{
return m_reset_y;
}
void CAutoMotoParam::SetResetY(int ypos)
{
m_reset_y=ypos;
}
IntParamImplement(CAutoMotoParam, STOP_BIGDUIJIAO)