青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

STL容器實現IniFileParser

IniFileParser.h

/*************************************************************************/
/* FileName:IniFileParser.cpp                                                                                                   */
/* Describe:IniFile@read、write                                                                                               */
/* Author  :Kagayaku                                                                                                               */
/* Date    :3.22.2010                                                                                                                */
/************************************************************************/

#ifndef _INIFILEPARSER_H_
#define _INIFILEPARSER_H_

#include <string>
#include <vector>
using namespace std;

 

struct CIniEntry
{
 CIniEntry(){}
 CIniEntry(char *szName,char *szValue):m_strIEName(szName),m_strIEValue(szValue){}
 string m_strIEName;
 string m_strIEValue;
};

struct CIniComment
{
 CIniComment(){}
 CIniComment(char *szIC):m_strIC(szIC){}
 string m_strIC;
};

struct CIniSection
{
 vector<CIniEntry>     m_vecIE;
 vector<CIniComment>   m_vecIC;
 string                m_strISName;
};


class CIniFile
{
public:
 CIniFile(const char *szIniFileFullPath);
 ~CIniFile();
 bool ReadIniFile(const char *szinifile);
 bool WriteIniFile(const char *szinifile);
 void TrimIniFile(char* &szinifile) const;
 void RemoveComment(char *szinifile) const;
 bool SearchMatchingIniFileSectionGetEntryValue(const char *szinifile,const char *szsectionname,const char *szentryname);
 bool SearchMatchingIniFileSectionSetEntryValue(const char *szinifile,const char *szsectionname,const char *szentryname,const char *szentryvalue);
   
private:
 vector<CIniSection> m_vecIS;
 string              m_strBufIEValue;
 string              m_strIniFileName;


};
#endif

IniFileParser.cpp

#include "IniFileParser.h"
#include <fstream>

CIniFile::CIniFile(const char *szIniFileFullPath):m_strIniFileName(szIniFileFullPath)
{
 ReadIniFile(szIniFileFullPath);
}

CIniFile::~CIniFile()
{

}

bool CIniFile::ReadIniFile(const char *szinifile)
{
 if (NULL==szinifile)
 {
  return false;
 }
 ifstream inifile(szinifile);
 if (NULL==inifile)
 {
  return false;
 }

 const int MAX_ROW_LENGTH=200;
 char chLineBufArray[MAX_ROW_LENGTH]={0};
 while(inifile.getline(chLineBufArray,MAX_ROW_LENGTH))
 {
  char *p=chLineBufArray;
  TrimIniFile(p);

  if (*p=='[')
  {
   RemoveComment(p);
   char *pEnd=strchr(p,']');
   if (NULL==pEnd || pEnd==p+1)
   {
    continue;
   }
   *pEnd = 0;
   CIniSection is;
   is.m_strISName=string(p+1);
   m_vecIS.push_back(is);
   continue;
  }

  if (m_vecIS.size()<1)
  {
   continue;
  }
  

  if (*p==';')
  {
   if (NULL==*(p+1))
   {
    continue;
   }
   else
   {
    CIniComment ic(p+1);
    m_vecIS[m_vecIS.size()-1].m_vecIC.push_back(ic);
    continue;
   }
   
  }
  
  char *pFlag=strchr(p,'=');
  if (NULL==pFlag || pFlag==p || NULL==*(pFlag+1))
  {
   continue;
  }
  else
  {
   *pFlag=0;
   CIniEntry ie;
   ie.m_strIEName=string(p);
   ie.m_strIEValue=string(pFlag+1);
   m_vecIS[m_vecIS.size()-1].m_vecIE.push_back(ie);
   continue;

  }

 }
 inifile.close();
 return true;

}

bool CIniFile::WriteIniFile(const char *szinifile)
{
 if (NULL==szinifile || m_strIniFileName!=szinifile)
 {
  return false;
 }

 ofstream inifile(szinifile);
 if (NULL==inifile)
 {
  return false;
 }

 for (int i=0;i!=m_vecIS.size();++i)
 {
  inifile.write("[",1);
  inifile.write(m_vecIS[i].m_strISName.c_str(),m_vecIS[i].m_strISName.size());
  inifile.write("]",1);
  inifile << endl;
  for (int j=0;j!=m_vecIS[i].m_vecIE.size();++j)
  {
   inifile.write(m_vecIS[i].m_vecIE[j].m_strIEName.c_str(),m_vecIS[i].m_vecIE[j].m_strIEName.size());
   inifile.write("=",1);
   inifile.write(m_vecIS[i].m_vecIE[j].m_strIEValue.c_str(),m_vecIS[i].m_vecIE[j].m_strIEValue.size());
   inifile << endl;
  }
 }
 inifile.close();
 return true;
}

void CIniFile::TrimIniFile(char* &szinifile) const
{
 if (NULL==szinifile)
 {
  return;
 }

 char *p=szinifile;

 while(*p==' ' || *p=='\t')
 {
  ++p;
 }

 szinifile=p;
 p=szinifile+strlen(szinifile)-1;

 while(*p==' ' || *p=='\t'|| *p=='\r'|| *p=='\n')
 {
  *p=0;
  --p;
 }

}

void CIniFile::RemoveComment(char *szinifile) const
{
 if (NULL==szinifile)
 {
  return;
 }
 char *p=strchr(szinifile,';');
 *p = 0;

}

bool CIniFile::SearchMatchingIniFileSectionGetEntryValue(const char *szinifile,const char *szsectionname,const char *szentryname)
{
 if (NULL==szinifile || NULL==szsectionname || NULL==szentryname)
 {
  return false;
 }

 if (m_strIniFileName!=szinifile)
 {
  return false;
 }

    bool temp=false;

 for (vector<CIniSection>::iterator iterIS=m_vecIS.begin();iterIS!=m_vecIS.end();++iterIS)
 {
  if ((*iterIS).m_strISName==szsectionname)
  {
   for (vector<CIniEntry>::iterator iterIE=(*iterIS).m_vecIE.begin();iterIE!=(*iterIS).m_vecIE.end();++iterIE)
   {
    if ((*iterIE).m_strIEName==szentryname)
    {
     m_strBufIEValue=(*iterIE).m_strIEValue;
     temp=true;
    }
   }
  }
 }
 return temp;

}

bool CIniFile::SearchMatchingIniFileSectionSetEntryValue(const char *szinifile,const char *szsectionname,const char *szentryname,const char *szentryvalue)
{
 if (NULL==szinifile || NULL==szsectionname || NULL==szentryname|| NULL==szentryvalue)
 {
  return false;
 }

 if (m_strIniFileName!=szinifile)
 {
  return false;
 }

 bool temp=false;

 for (vector<CIniSection>::iterator iterIS=m_vecIS.begin();iterIS!=m_vecIS.end();++iterIS)
 {
  if ((*iterIS).m_strISName==szsectionname)
  {
   for (vector<CIniEntry>::iterator iterIE=(*iterIS).m_vecIE.begin();iterIE!=(*iterIS).m_vecIE.end();++iterIE)
   {
    if ((*iterIE).m_strIEName==szentryname)
    {
     (*iterIE).m_strIEValue=szentryvalue;
     temp=true;
    }
   }
  }
 }
   
 
 return temp?WriteIniFile(szinifile):false;

}

posted on 2010-03-22 23:01 avatar 閱讀(1817) 評論(5)  編輯 收藏 引用

評論

# re: STL容器實現IniFileParser 2010-03-23 11:23 陳梓瀚(vczh)

http://m.shnenglu.com/vczh/archive/2010/03/07/109103.html  回復  更多評論   

# re: STL容器實現IniFileParser 2010-03-23 20:03 萌萌

你不寫提要 怎么看啊  回復  更多評論   

# re: STL容器實現IniFileParser 2010-03-29 16:29 淡月清風

哇,完全沒有注釋  回復  更多評論   

# re: STL容器實現IniFileParser 2010-04-08 12:12 jmchxy

#ifndef __JFILECONFIG_H__
#define __JFILECONFIG_H__
/////////////////////////////////////////////
/// JFileConfig ini文件操作類
/////////////////////////////////////////////
#include "jconfig.h"
#include <map>
#include <vector>

namespace jlib
{

// ini 文件中名字不分大小寫
struct SectionLess
{
bool operator() (const JString& Key1, const JString& Key2)const
{
return Key1.compareNoCase(Key2) < 0;
}
};
//-------------------------------------------
// 定義foreach 函數需要使用的函數類型
// pArg 為傳遞給 函數的數據
//-------------------------------------------
typedef bool (*FOREACHFUNC)(const JString& section, const JString& name, JConfigVal& value, LPVOID pArg);
class JLIBAPI JFileConfig: JConfigBase
{
public:
// 構造析構函數
JFileConfig();
virtual ~JFileConfig();
public:
// 裝載配置信息, 從文件或其他媒介
virtual bool load(LPCTSTR pszFilename);
// 保存配置到文件
virtual bool save(LPCTSTR pszFilename)const;
// 獲取配置信息, key, name, 獲得value
// 讀取失敗返回 false
// 獲取通用類型的值
virtual bool getValue(LPCTSTR sectionName, LPCTSTR name, JConfigVal& jRval)const;
// 獲取整數值
virtual bool getInt(LPCTSTR sectionName, LPCTSTR name, int& iRval)const;
// 獲取字符串
virtual bool getString(LPCTSTR sectionName, LPCTSTR name, JString& szRval)const;
// 設置配置, 如果沒有則創建指定名/值
// 設置通用類型的值
virtual bool setValue(LPCTSTR sectionName, LPCTSTR name, const JConfigVal& jVal);
// 設置整型的值
virtual bool setInt(LPCTSTR sectionName, LPCTSTR name, int iVal);
// 設置字符串值, 如果沒有則創建指定名/值
virtual bool setString(LPCTSTR sectionName, LPCTSTR name, LPCTSTR szVal);
//--------------------------------------------------
// 遍歷函數
// 如果用戶定義的遍歷函數返回了 false, 結束遍歷
bool foreach(FOREACHFUNC fpForeach, LPVOID pArgs);
//========================================
#ifdef _UNIT_TEST_ //單元測試, 遍歷一個ini文件
static void unitTest(LPCTSTR filename);
#endif //_UNIT_TEST_
//========================================
public:
/////////////////////////////////////////////
/// 配置節信息
/////////////////////////////////////////////
typedef std::map<JString, JConfigVal, SectionLess> Dict;
typedef std::map<JString, JConfigVal, SectionLess>::iterator DictIterator;
typedef std::map<JString, JConfigVal, SectionLess>::const_iterator ConstDictIterator;
// 結點信息
struct JConfigSection
{
JString m_strSectionName; //節名
Dict m_Items; //名/值對
public:
JConfigSection(): m_strSectionName(), m_Items() { }
~JConfigSection(){ m_Items.clear(); }
// 加入一個 名/值 對
bool set(const JString& name, const JConfigVal& value)
{
// 查找內容
DictIterator iter = m_Items.find( name );
if(iter == m_Items.end())
{
// 沒找到, 插入
m_Items.insert( Dict::value_type( name, value));
}
// 如果已存在, 修改
m_Items[name] = value;
return true;
}
bool get(JString& name, JConfigVal& value)const
{
// 查找內容
ConstDictIterator iter = m_Items.find( name );
if(iter == m_Items.end())
{
// 沒找到,
return false;
}
// 如果已存在, 返回
value = iter->second;
return true;
}
};
private:
//
typedef std::vector<JConfigSection>::iterator SectionIter;
typedef std::vector<JConfigSection>::const_iterator ConstSectionIter;
// 創建一個節
bool createSection(const JString& sectionName);
// 查找節, 返回對應的索引
// 如果不存在, 返回 end(),
ConstSectionIter findSection(const JString& sectionName)const;
SectionIter findSection(const JString& sectionName);
// const static int MAX_SECTION = 10; //最多的節數
private:
std::vector<JConfigSection> m_Sections;
// 不允許拷貝對象
DECLARE_NO_COPY_CLASS(JFileConfig);
};

} //end namespace

#endif //__JFILECONFIG_H__  回復  更多評論   

# re: STL容器實現IniFileParser 2010-04-08 12:17 jmchxy

//===============================================
bool JFileConfig::getValue(LPCTSTR sectionName, LPCTSTR name, JConfigVal& rval)const
{
// 查找節
JString jstrSection(sectionName);
JString jstrName(name);
bool bRet = false;
// 查看是否已經存在
ConstSectionIter iter = findSection( jstrSection );
// 存在節
if(iter == m_Sections.end())
{
return false;
}
return iter->get(jstrName, rval);
}

/////////////////////////////////////////////
// 裝載配置信息, 從文件或其他媒介
/////////////////////////////////////////////
#ifdef _DEBUG
#define _OUTPUT_STATE
#endif
bool JFileConfig::load(LPCTSTR pszFilename)
{
JStdioFile inifile(pszFilename, JFileBase::modeRead);
JString CurSection;

while(!inifile.eof())
{
//逐行分析數據
JString line = inifile.getline();
// 去掉末尾的行計數符
line.chomp();
if(line.length() == 0)
{
continue; //跳過空行
}
// 如果是注釋行, 跳過
// ; 和 # 開始的行是注釋
if( (line[0] == _T(';'))||(line[0] == _T('#')))
{
continue;
}
if(line[0] == _T('['))
{
//是節名?
int i = line.find( _T(']') );
if(i > 0)
{// 節名, 取出節的名字, 創建節
CurSection = line.substr(1, i-1);
createSection(CurSection);
#ifdef _OUTPUT_STATE //調試用
_tprintf( _T("create seciton: %s\n"), CurSection.c_str());
#endif
}
continue; //錯誤的行直接跳過
}
else
{ // 名/值 對定義的行, 查找 '=' 字符
int i = line.find( _T('='));
if(i <= 0)
{
continue; //沒有 = 字符, 跳過
}
JString strName = line.substr(0, i);
strName.TrimRight();
JString strValue = line.substr(i + 1, -1);
strValue.TrimLeft();
// 插入值
setString(CurSection, strName, strValue);
}
}
return true;
}

//-------------------------------------
// 保存配置到文件
//-------------------------------------
bool JFileConfig::save(LPCTSTR pszFilename)const
{
JFile inifile(pszFilename, JFileBase::modeWrite|JFileBase::modeCreate);
JString strLine(128);

for(ConstSectionIter sectIter = m_Sections.begin();
sectIter != m_Sections.end();
++sectIter)
{
// 當前節的名字
const JString& sectionNmae = sectIter->m_strSectionName;
// 寫入節名
strLine.clear();
strLine += _T("[");
strLine += sectionNmae;
strLine += _T("]\r\n");
inifile.write(strLine.c_str(), strLine.length());
// 當前節對應的map
const Dict& CurSection = sectIter->m_Items;
// 遍歷名字/值
ConstDictIterator dictIter = CurSection.begin();
while(dictIter != CurSection.end())
{
const JString& name = dictIter->first;
const JConfigVal& value = dictIter->second;
strLine.clear();
strLine += name;
strLine += _T("=");
strLine += value.toString();
strLine += _T("\r\n");
inifile.write(strLine.c_str(), strLine.length());
++dictIter;
}
}
return true;
}

回復不能太長, 這是我的庫中定義的 inifile 處理類  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2010年4月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

導航

統計

常用鏈接

留言簿(2)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久夜色精品一区| 欧美日韩精品欧美日韩精品 | 一区二区三区在线观看视频| 91久久精品网| 99re6热在线精品视频播放速度 | 亚洲高清久久| 免费永久网站黄欧美| 亚洲国产欧美另类丝袜| 99在线热播精品免费99热| 欧美日韩免费高清| 亚洲一级特黄| 美女主播一区| 亚洲一区bb| 在线观看视频一区二区欧美日韩| 免费看的黄色欧美网站| 一本一道久久综合狠狠老精东影业| 欧美亚洲一区三区| 一区二区三区在线视频观看| 欧美国产在线观看| 久久国内精品视频| 日韩视频免费在线| 久久亚洲精品欧美| 亚洲一区二区精品视频| 黄色成人免费观看| 国产精品天天看| 欧美激情五月| 欧美a级大片| 久久成人免费| 欧美一级淫片播放口| 一区二区三区蜜桃网| 亚洲国产精品第一区二区| 免费成人在线观看视频| 欧美一区二区三区四区在线观看| 亚洲精品视频在线| 久久久久久久激情视频| 欧美自拍偷拍| 欧美亚洲视频一区二区| 中文在线不卡视频| 夜夜嗨av一区二区三区中文字幕 | 欧美国产日韩一区| 久久久久久亚洲精品中文字幕| 亚洲一区二区四区| 午夜精品久久| 欧美在线播放高清精品| 亚洲欧美一区二区三区久久 | 国产午夜久久久久| 韩日精品视频| 亚洲黄一区二区三区| 亚洲精品在线电影| 亚洲欧美激情诱惑| 欧美在线一二三四区| 久久综合99re88久久爱| 亚洲激情综合| 亚洲影视中文字幕| 久久精品国产视频| 欧美另类69精品久久久久9999| 欧美亚洲不卡| 在线色欧美三级视频| 亚洲午夜视频在线观看| 欧美不卡一卡二卡免费版| 亚洲欧洲午夜| 久久精品一区蜜桃臀影院| 欧美精品日韩三级| 激情丁香综合| 亚洲欧洲av一区二区| 亚洲高清在线观看| 久久精品国产免费看久久精品| 欧美国产视频一区二区| 国产一区视频网站| 亚洲国产日韩欧美在线99| 亚欧美中日韩视频| 99精品视频网| 欧美精品99| 在线国产精品播放| 久久经典综合| 亚洲一区精品视频| 国产精品户外野外| 在线视频亚洲一区| 最新亚洲一区| 欧美黄色大片网站| 91久久国产精品91久久性色| 毛片av中文字幕一区二区| 亚洲欧美综合一区| 国产亚洲激情视频在线| 久久精品国产亚洲aⅴ| 午夜精品久久久久久久久| 国产精品久久久久91| 亚洲在线视频一区| 午夜精品久久久99热福利| 国产欧美精品一区aⅴ影院| 亚洲欧美制服另类日韩| 欧美一区二区三区在线观看视频| 国产在线拍偷自揄拍精品| 久久久久国产一区二区三区四区| 亚洲欧美在线网| 好看的日韩av电影| 欧美大片专区| 国产精品高潮呻吟视频| 欧美一区二区在线免费观看| 欧美一级视频免费在线观看| 亚洲第一区在线| av成人天堂| 黄色一区二区在线| 亚洲免费成人av| 在线成人av| 一本色道久久综合亚洲精品婷婷 | 精品不卡视频| 99热这里只有成人精品国产| 国产精品视频xxxx| 亚洲国产视频一区二区| 亚洲免费网站| 夜色激情一区二区| 久久精品免费观看| 亚洲综合国产激情另类一区| 久久久久久久久久久久久9999| 一区二区三区日韩欧美精品| 久久久久久**毛片大全| 午夜精品剧场| 国产精品v欧美精品v日韩精品 | 国产日韩精品视频一区二区三区| 欧美国产日韩精品免费观看| 国产日韩欧美制服另类| 妖精成人www高清在线观看| 亚洲欧洲日韩在线| 老司机精品福利视频| 久久夜精品va视频免费观看| 国产精品一区在线观看你懂的| 亚洲国产精品日韩| 亚洲国内高清视频| 欧美美女福利视频| 亚洲乱码国产乱码精品精可以看| 亚洲欧洲三级| 欧美婷婷久久| 午夜欧美大尺度福利影院在线看| 久久av在线| 在线观看精品一区| 免费视频一区| 一区二区日韩伦理片| 久久xxxx精品视频| 在线看不卡av| 欧美视频一区二区在线观看 | 亚洲福利视频在线| 亚洲精品日韩在线| 国产精品你懂的在线欣赏| 亚洲欧美视频一区| 男男成人高潮片免费网站| 99riav久久精品riav| 国产精品乱人伦中文| 久色婷婷小香蕉久久| 日韩一级片网址| 久久九九热免费视频| 在线综合+亚洲+欧美中文字幕| 国产日韩精品在线播放| 欧美激情一区二区三区全黄| 亚洲制服少妇| 亚洲伦理一区| 亚洲成色777777在线观看影院| 欧美精品一区在线播放| 欧美伊人久久久久久午夜久久久久 | 亚洲精品美女久久久久| 久久国产主播精品| 亚洲私拍自拍| 亚洲精品一线二线三线无人区| 好吊视频一区二区三区四区| 欧美四级在线观看| 欧美日韩第一区| 欧美激情精品久久久久久久变态| 久久久91精品国产一区二区三区 | 国产手机视频精品| 国产精品国产三级国产| 欧美激情aaaa| 欧美—级a级欧美特级ar全黄| 久久影视精品| 久久久蜜桃精品| 久久久亚洲国产美女国产盗摄| 亚洲在线成人精品| 亚洲午夜激情免费视频| 一区二区三区成人| 亚洲欧美综合v| 久久精品视频在线| 久久久久看片| 欧美日韩和欧美的一区二区| 欧美91大片| 欧美日韩免费观看中文| 国产精品久99| 在线观看亚洲| 亚洲午夜av电影| 欧美一区二区国产| 欧美va亚洲va日韩∨a综合色| 欧美成人黄色小视频| 99视频精品| 久久久久久久综合狠狠综合| 欧美成人精品不卡视频在线观看| 欧美日韩一卡二卡| 国产亚洲综合在线| 亚洲精品乱码视频| 欧美有码在线观看视频| 亚洲电影在线观看| 午夜精品一区二区三区在线| 欧美激情精品久久久久久免费印度|