一个简单的读 ini 文件类

fileini.h 

#ifndef _FILE_CONFIG_H_
#define _FILE_CONFIG_H_

#include <iostream>
#include <fstream>
#include <map>
#include <string>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

class CFileConfig
{
public:
    CFileConfig();
    CFileConfig(const char* szFileName);
    virtual ~CFileConfig();

public:
    string& operator[](const char* szName);
    string& operator()(const char* szSection, const char* szName);

    int ParseFile(const char* szConfigFile);
    map<string, string> GetMap();

private:
    static int StrimString(char* szLine);
    int ParseFile();

private:
    ifstream m_ConfigFile;
    map<string, string> m_ConfigMap;
};

#endif

fileini.cpp 

#include "fileini.h"

CFileConfig:: CFileConfig()
{
}

CFileConfig:: CFileConfig(const char* szFileName)
{
	m_ConfigFile.open(szFileName);
	ParseFile();
}

CFileConfig:: ~CFileConfig()
{	
	m_ConfigFile.close();
}

// delete pre- or -end white space
int CFileConfig:: StrimString(char* szLine)
{
	int i, j;

	// ignor -end comment
	char *p;
	p= strstr(szLine, "//");
	if (p!=NULL) {
		*p=0;
	}

	// delete -end white space
	j= strlen(szLine)-1;
	while ((szLine[j]==' ')||(szLine[j]=='\t')||(szLine[j]=='\n')||(szLine[j]=='\r'))
	{
		if (j == 0) return -1;
		szLine[j]=0;
		j--;
	}
	// delete pre- white space
	i=0; j=0;
	while ((szLine[j] == ' ')||(szLine[j] == '\t')) {
		if (szLine[j] == 0) return -1;
		j++;
	}
	// shift string
	while (szLine[j] != 0) {
		szLine[i] = szLine[j];
		i++;
		j++;
	}
	szLine[i]=0;

	// whole comment line
	if ((szLine[0]=='/')&&(szLine[1]=='/'))
		return 1;

	return 0;
}

int CFileConfig:: ParseFile(const char* szConfigFile)
{
	m_ConfigFile.open(szConfigFile);
	if (m_ConfigFile.fail()) {
		return -1;
	}
	return ParseFile();
}


int CFileConfig:: ParseFile()
{
	char szLine[1024];
	char szSection[64], szParam[128];
	char *pColon;
	int  iLen;

	bzero(szSection, sizeof(szSection));
	bzero(szParam, sizeof(szParam));

	while (m_ConfigFile.getline(szLine, sizeof(szLine))) {
		if (StrimString(szLine) != 0) continue;
		iLen = strlen(szLine);
		if (((szLine[0]=='[') && (szLine[iLen-1]==']')) ||
			((szLine[0]=='<') && (szLine[iLen-1]=='>')) )
		{
			pColon = szLine+1;
			szLine[iLen-1] = 0;
			bzero(szSection, sizeof(szSection));
			strncpy(szSection, pColon, sizeof(szSection));
			// section name
			continue;
		}
		if ((pColon= index(szLine, '=')) == NULL) {
			pColon= index(szLine, ':');
		}
		if (pColon==NULL) continue;
		*pColon=0;
		pColon++;
		if (StrimString(pColon) < 0) continue;
		if (StrimString(szLine) < 0) continue;
		if (szSection[0] != 0) {
			snprintf(szParam, sizeof(szParam), "%s.%s", szSection, szLine);
		}
		else {
			snprintf(szParam, sizeof(szParam), "%s", szLine);
		}
		m_ConfigMap[szParam]= pColon;
	}
	return 0;
}

map<string, string> CFileConfig::GetMap()
{
    return m_ConfigMap;
}

string& CFileConfig:: operator[](const char* szParam)
{
	if (szParam == NULL)
	{
		fprintf(stderr, "config operator[] error: param null");
		m_ConfigMap[""] = "";
		return m_ConfigMap[""];
	}
	
	if (m_ConfigMap[szParam].empty())
	{
		fprintf(stderr, "config[%s] error.\n", szParam);
		m_ConfigMap[szParam] = "";
	}
	return m_ConfigMap[szParam];
}

string& CFileConfig:: operator()(const char* szSection, const char* szName)
{
	if (szSection == NULL || szName == NULL)
	{
		fprintf(stderr, "config operator() error: param null");
		m_ConfigMap[""] = "";
		return m_ConfigMap[""];
	}
	
	char szParam[64] = {0};
	snprintf(szParam, sizeof(szParam), "%s.%s", szSection, szName);

	if (m_ConfigMap.find(szParam) == m_ConfigMap.end())
	{
		fprintf(stderr, "config[%s.%s] error.\n", szSection, szName);
		m_ConfigMap[szParam] = "";
	}
	return m_ConfigMap[szParam];
}

 

转载于:https://my.oschina.net/tsh/blog/1554802

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值