stl读取ini配置文件例子

该博客介绍了如何使用C++标准模板库(STL)中的map和struct解析ini配置文件。通过定义一个名为analyzeini的结构体和IniFile类,实现对ini文件的读取和键值对提取。IniFile类包含open方法来打开文件,read方法来获取指定节(section)和键(key)的值。博客还包括一个简单的示例程序,展示如何使用IniFile类读取并打印ini文件的内容。
导读:
  #ifndef _INIFILE_H__
  #define _INIFILE_H__
  #include
  #include
  #include
  #include
  #include
  #include
  using namespace std;
  typedef map strMap;
  typedef strMap::iterator strMapIt;
  const char*const MIDDLESTRING = "_____***_______";
  struct analyzeini{
  string strsect;
  strMap *pmap;
  analyzeini(strMap &strmap):pmap(&strmap){}
  void operator()( const string &strini)
  {
  int first =strini.find('[');
  int last = strini.rfind(']');
  if( first != string::npos &&last != string::npos &&first != last+1)
  {
  strsect = strini.substr(first+1,last-first-1);
  return ;
  }
  if(strsect.empty())
  return ;
  if((first=strini.find('='))== string::npos)
  return ;
  string strtmp1= strini.substr(0,first);
  string strtmp2=strini.substr(first+1, string::npos);
  first= strtmp1.find_first_not_of(" /t");
  last = strtmp1.find_last_not_of(" /t");
  if(first == string::npos || last == string::npos)
  return ;
  string strkey = strtmp1.substr(first, last-first+1);
  first = strtmp2.find_first_not_of(" /t");
  if(((last = strtmp2.find("/t#", first )) != -1) ||
  ((last = strtmp2.find(" #", first )) != -1) ||
  ((last = strtmp2.find("/t//", first )) != -1)||
  ((last = strtmp2.find(" //", first )) != -1))
  {
  strtmp2 = strtmp2.substr(0, last-first);
  }
  last = strtmp2.find_last_not_of(" /t");
  if(first == string::npos || last == string::npos)
  return ;
  string value = strtmp2.substr(first, last-first+1);
  string mapkey = strsect + MIDDLESTRING;
  mapkey += strkey;
  (*pmap)[mapkey]=value;
  return ;
  }
  };
  class IniFile
  {
  public:
  IniFile( ){};
  ~IniFile( ){};
  bool open(const char* pinipath)
  {
  return do_open(pinipath);
  }
  string read(const char*psect, const char*pkey)
  {
  string mapkey = psect;
  mapkey += MIDDLESTRING;
  mapkey += pkey;
  strMapIt it = c_inimap.find(mapkey);
  if(it == c_inimap.end())
  return "";
  else
  return it->second;
  }
  protected:
  bool do_open(const char* pinipath)
  {
  ifstream fin(pinipath);
  if(!fin.is_open())
  return false;
  vector strvect;
  while(!fin.eof())
  {
  string inbuf;
  getline(fin, inbuf,'/n');
  strvect.push_back(inbuf);
  }
  if(strvect.empty())
  return false;
  for_each(strvect.begin(), strvect.end(), analyzeini(c_inimap));
  return !c_inimap.empty();
  }
  strMap c_inimap;
  };
  #endif
  ---------------------------------------------------------------------------------------------------
  #include
  #include "inifile.h"
  using namespace std;
  int main()
  {
  IniFile ini;
  if(!ini.open("test.ini"))
  return -1;
  string strvalue = ini.read("sect1","key1");
  if(strvalue.empty())
  return -1;
  else
  cout<<"value="< <
  return 0;
  }
  test.ini:
  [sect1]
  key1=xywc
  --------------------------------------------------------------------------------------------
  RM= rm -f
  CXX= g++
  FLAGS= -Wno-ctor-dtor-privacy -Wno-deprecated #-fPIC
  AR=ar rc
  CFLAGS=-L.
  LIBCFLAGS= -D_REENTRANT #-fPIC
  OBJS= $(SOURCES:.cxx=.o)
  .SUFFIXES: .pc .cxx .cpp
  .cxx.o:
  $(RM) $@
  $(CXX) -c -O $(FLAGS) $(LIBCFLAGS) -o $@ $<
  .cpp.o:
  $(RM) $@
  $(CXX) -c -g -O $(FLAGS) $(LIBCFLAGS) -o $@ $<
  OBJS=main.o
  all:
  test
  test: $(OBJS)
  $(RM) $@
  $(CXX) -o $@ $(OBJS)
  clean:
  rm -f test
  rm -f *.o
  Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=479278

本文转自
http://blog.youkuaiyun.com/mu_gong/archive/2005/09/13/479278.aspx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值