很实用的C++ ini解析类

头文件:

#pragma once
#include <map>
#include <string>

class INIReader
{
public:
	INIReader(std::string filename);
	INIReader(const char* buf);
	int	ParseError();
	std::string	Get(std::string section, std::string name, std::string default_value);
	long	GetInteger(std::string section, std::string name, long default_value);
	double	GetReal(std::string section, std::string name, double default_value);
	bool	GetBoolean(std::string section, std::string name, bool default_value);

private:
	static std::string MakeKey(std::string section, std::string name);
	static int ValueHandler(void* user, const char* section, const char* name, const char* value);

private:
	int	_error;
	std::map<std::string, std::string> _values;
};

cpp文件:

// Read an INI file into easy-to-access name/value pairs.

#include "StdAfx.h"
#include "INIReader.h"
#include <algorithm>
#include <cctype>
#include <cstdlib>
#include "ini.h"

INIReader::INIReader(std::string filename)
{
	_error = ini_parse(filename.c_str(), ValueHandler, this);
}

INIReader::INIReader(const char* buf)
{
	_error = ini_parse_mem(buf, ValueHandler, this);
}

int INIReader::ParseError()
{
	return _error;
}

std::string INIReader::Get(std::string section, std::string name, std::string default_value)
{
	std::string key = MakeKey(section, name);
	return _values.count(key) ? _values[key] : default_value;
}

long INIReader::GetInteger(std::string section, std::string name, long default_value)
{
	std::string valstr = Get(section, name, "");
	const char* value = valstr.c_str();
	char* end;
	// This parses "1234" (decimal) and also "0x4D2" (hex)
	long n = strtol(value, &end, 0);
	return end > value ? n : default_value;
}

double INIReader::GetReal(std::string section, std::string name, double default_value)
{
	std::string valstr = Get(section, name, "");
	const char* value = valstr.c_str();
	char* end;
	double n = strtod(value, &end);
	return end > value ? n : default_value;
}

bool INIReader::GetBoolean(std::string section, std::string name, bool default_value)
{
	std::string valstr = Get(section, name, "");
	// Convert to lower case to make string comparisons case-insensitive
	std::transform(valstr.begin(), valstr.end(), valstr.begin(), ::tolower);
	if (valstr == "true" || valstr == "yes" || valstr == "on" || valstr == "1")
		return true;
	else if (valstr == "false" || valstr == "no" || valstr == "off" || valstr == "0")
		return false;
	else
		return default_value;
}

std::string INIReader::MakeKey(std::string section, std::string name)
{
	std::string key = section + "." + name;
	// Convert to lower case to make section/name lookups case-insensitive
	std::transform(key.begin(), key.end(), key.begin(), ::tolower);
	return ke
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值