• <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>

            高性能服務器開發(fā);C++深探

            單實例模式的一個C++讀取配置文件的類CConfig2Map

            由于項目中經(jīng)常遇到讀取配置文件的地方,為方便調(diào)用雖寫了個功能簡單,使用方便的配置文件類,基本思路是將配置文件緩沖到map當中,目前只支持一級配置,多級別的樹形配置暫不支持,有需要的兄弟請完善。
            為單實例模式。
            config2map.h
            // config2map.h
            // 配置文件到map的映射類,單實例模式
            // 創(chuàng)建: 2010-09-13 changym, changup@qq.com
            // 修改: 
            //       
            //////////////////////////////////////////////////////////////////////
            #ifndef _CONFIG2MAP_H_
            #define _CONFIG2MAP_H_
            #include 
            <map>
            using namespace std;

            /*僅僅是為了能讓編譯通過添加日志相關部分*/
            #define LOG_DBG  1
            #define LOG_INFO 2
            #define LOG_ERR  3
            class CLog
            {
            public:
                
            int log(int,const char*,)
                
            {
                    
            return 0;
                }

            }


            typedef 
            struct tagNode
            {
                tagNode(
            const char* pname,const char* pvalue)
                
            {
                    name
            =0;
                    value
            =0;
                    
            if(pname)
                    
            {
                        name 
            = new char[strlen(pname)+1];
                        strcpy(name,pname);
                        name[strlen(pname)]
            ='\0';
                    }

                    
            if(pvalue)
                    
            {
                        value 
            = new char[strlen(pvalue)+1];
                        strcpy(value,pvalue);
                        value[strlen(pvalue)]
            ='\0';
                    }

                }

                
            ~tagNode()
                
            {
                    
            if(name)
                    
            {
                        delete [] name;
                        name
            =0;
                    }

                    
            if(value)
                    
            {
                        delete [] value;
                        value
            =0;
                    }

                }

                
            void print(CLog* plog)
                
            {
                    plog
            ->log(LOG_DBG,"\t%s=%s",name,value);
                }

                
            char  *name;
                
            char  *value;
            }
            NODE,*PNODE;

            class CNodeList : public list<PNODE>
            {
            public:
                
            virtual ~CNodeList()
                
            {
                    PNODE pnode 
            = NULL;
                    list
            <PNODE>::iterator iter = begin();
                    
            while(!empty())
                    
            {
                        pnode 
            = front();
                        delete pnode;
                        pop_front();
                    }

                    clear();
                }

                
            void print(CLog* plog)
                
            {
                    list
            <PNODE>::iterator iter = begin();
                    
            while(iter != end())
                    
            {
                        (
            *iter++)->print(plog); 
                    }

                }

            }
            ;
            typedef CNodeList
            * PNODELIST;
            typedef map
            <const char*,PNODELIST,eq_str_map> CIniMap;

            class CConfig2Map : public CBase,public CIniMap
            {
            public:
                
            ~CConfig2Map()
                
            {
                    PNODELIST pnodelist 
            = NULL;
                    PNODE pnode 
            = NULL;
                    
            char* pszname = NULL;
                    
            char* pszvalue = NULL;
                    CIniMap::iterator iter 
            = begin();
                    
            while(iter!=end())
                    
            {
                        pszname 
            = (char*)((*iter).first);
                        delete [] pszname;
                        delete (
            *iter).second;
                        iter
            ++;
                    }
                    
                    clear();
                }

                
            public:
                
            static CConfig2Map* Instance(const char* pszinifilename)
                
            {
                    
            if(!_instance)
                        _instance 
            = new CConfig2Map(pszinifilename);
                    
            return _instance;
                }


                
            int getstring(const char* pszsection,const char* pszname,char* pszvalue,int buflen)
                
            {
                    #ifdef _DEBUG
                    CLog log;
                    
            #endif
                    
                    PNODELIST pnodelist 
            = (*this)[pszsection];
                    
            if(pnodelist==NULL)
                    
            {
                        #ifdef _DEBUG
                        log.log(LOG_DBG,
            "section:%s not found",pszsection);
                        
            #endif
                        
            return 0;
                    }

                    #ifdef _DEBUG
                    log.log(LOG_DBG,
            "section:%s found",pszsection);
                    
            #endif
                    CNodeList::iterator iter 
            = pnodelist->begin();
                    PNODE pnode 
            = NULL;
                    
            int bfound = 0;
                    
            while(iter!=pnodelist->end())
                    
            {
                        #ifdef _DEBUG
                        log.log(LOG_DBG,
            "name=%s,value=%s",(*iter)->name,(*iter)->value);
                        
            #endif
                        
            if(!strcmp(pszname,(*iter)->name))
                        
            {
                            strncpy(pszvalue,(
            *iter)->value,buflen);
                            bfound 
            = 1;
                            
            break;
                        }

                        iter
            ++;
                    }


                    
            return bfound;
                }


                
            void print(CLog* plog)
                
            {
                    
            const char* pszkey = NULL;
                    PNODELIST pnodelist 
            = NULL;
                    CIniMap::iterator iter 
            = begin();
                    plog
            ->log(LOG_DBG,"++++++++++++++++begin print mapconfig+++++++++++++++++");
                    
            while(iter!=end())
                    
            {
                        plog
            ->log(LOG_DBG,"section=%s",(*iter).first);
                        pnodelist 
            = (*iter).second;
                        pnodelist
            ->print(plog);
                        iter
            ++;
                    }

                    plog
            ->log(LOG_DBG,"++++++++++++++++print mapconfig end ++++++++++++++++++");    
                }

                
            private:
                CConfig2Map(
            const char* pszinifilename) throw(const char*);
                
            private:
                
            static CConfig2Map*  _instance;    
            }
            ;

            #endif //_CONFIG2MAP_H_

            config2map.cpp
            #include "config2map.h"

            CConfig2Map
            * CConfig2Map::_instance = NULL;
                    
            CConfig2Map::CConfig2Map(
            const char* pszinifilename) throw(const char*)
            {
                #ifdef _DEBUG
                CLog log;
                
            #endif
                FILE
            * pfile = fopen(pszinifilename, "r");
                
            char* pszerrmsg;
                
            if(!pfile)
                {
                    pszerrmsg 
            = new char[1024];
                    memset(pszerrmsg,
            0x00,1024);
                    SNPRINTF(pszerrmsg,
            1023,"failed to open file [%s]",pszinifilename);
                    
            throw(pszerrmsg);
                }

                #ifdef _DEBUG
                
            int ireadline = 0;
                
            #endif    
                
            char  szBuf[1024= {0};
                
            int buflen = 0;
                
            char* key;
                
            char* keybegin,*keyend;
                
            int bkeyendfound = 0;
                PNODELIST pnodelist 
            = NULL;
                
            while(fgets(szBuf, 1023, pfile))
                {
                    buflen 
            = strlen(szBuf);        
                    
            if(buflen<3)
                        
            continue;
                        
                    
            if(buflen>=1)
                    {
                        
            if(szBuf[buflen-1]==0x0a || szBuf[buflen-1]==0x0d)
                            szBuf[buflen
            -1= 0x00;
                    }
                    
            if(buflen>=2)
                    {
                        
            if(szBuf[buflen-2]==0x0a || szBuf[buflen-2]==0x0d)
                            szBuf[buflen
            -2= 0x00;            
                    }
                        
                    #ifdef _DEBUG
                    log.log(LOG_DBG,
            "%d=%s",buflen,szBuf);
                    
            #endif
                    
                    
            char* p = szBuf;
                    
            if(*p=='#' || *p=='\n' || *p=='\0'continue;
                    
            if(*== '[')
                    {
                        
                        #ifdef _DEBUG
                        printf(
            "found [\n");
                        
            #endif
                        keybegin 
            = p+1;
                        bkeyendfound 
            = 0;
                        
            while(*p)
                        {
                            
            if(*p==']')
                            {
                                
                                #ifdef _DEBUG
                                printf(
            "found ]\n");
                                
            #endif
                                bkeyendfound 
            = 1;
                                keyend 
            = p-1;
                                
            break;
                            }    
                            p
            ++;            
                        }
                        
            if(!bkeyendfound)
                        {
                            #ifdef _DEBUG
                            printf(
            "key [] not match\n");
                            
            #endif
                            
            throw("key [] not match\n");
                        }
                        
            if(keybegin>keyend)
                        {
                            #ifdef _DEBUG
                            printf(
            "invalid key[\"\"]\n");
                            
            #endif
                            
            throw("invalid key[""]");
                            
                        }
                        key 
            = new char[keyend-keybegin+1+1];
                        memset(key,
            0x00,keyend-keybegin+1+1);
                        strncpy(key,keybegin,keyend
            -keybegin+1);
                        
            //key[keyend-keybegin+1+1]='\0'; //2010-10-13:這個錯誤,找了一天啊
                        key[keyend-keybegin+1]='\0';
                        #ifdef _DEBUG
                        printf(
            "new key=%s\n", key);
                        
            #endif
                        pnodelist 
            = new CNodeList();
                        (
            *this)[key] = pnodelist;
                         
                        
            continue;
                    }                
                    
            while(*&& *p++!='=');        
                    
            if(p==(szBuf+strlen(szBuf))) continue;

                    
            char  name[256= {0};
                    
            char  value[1024= {0};
                    strncpy(name, szBuf, p
            -szBuf-1);
                    strncpy(value, p, szBuf
            +strlen(szBuf)-p);
                    
            if(pnodelist==NULL)
                    {
                        #ifdef _DEBUG
                        printf(
            "key not found,%s=%s discard\n",name,value);
                        
            #endif
                    }
                    
            else
                    {
                        PNODE pnode
            = new NODE(name,value);
                        pnodelist
            ->push_back(pnode);
                    }

                    
            //proc(pvoid,key,value);        
                }

                fclose(pfile);
            }

            posted on 2010-12-14 15:48 changup 閱讀(3701) 評論(5)  編輯 收藏 引用 所屬分類: 設計模式實踐隨想

            Feedback

            # re: 單實例模式的一個C++讀取配置文件的類CConfig2Map 2010-12-14 19:24 Skill

            有bug  回復  更多評論   

            # re: 單實例模式的一個C++讀取配置文件的類CConfig2Map 2010-12-15 11:55 水星家紡

            我也看到有bug   回復  更多評論   

            # re: 單實例模式的一個C++讀取配置文件的類CConfig2Map 2010-12-20 23:24 luckycat

            推薦使用 boost.property_tree,簡潔,高效,支持多種格式: ini , xml ...
            并且使用統(tǒng)一的操作接口。  回復  更多評論   

            # re: 單實例模式的一個C++讀取配置文件的類CConfig2Map 2010-12-23 21:47 changup

            @luckycat
            boost庫不想使用  回復  更多評論   

            # re: 單實例模式的一個C++讀取配置文件的類CConfig2Map 2011-12-26 15:31

            一點也沒看明白  回復  更多評論   

            久久99国产精品久久久| 无码任你躁久久久久久久| 久久99国产精品尤物| 国产精品久久毛片完整版| 99久久精品免费看国产| 亚洲国产婷婷香蕉久久久久久| 久久精品无码一区二区WWW | 色综合久久中文字幕综合网| 国内精品人妻无码久久久影院导航 | 久久国产成人亚洲精品影院| 伊人久久大香线蕉无码麻豆| 久久水蜜桃亚洲av无码精品麻豆| 欧美精品一区二区精品久久| 婷婷久久综合| 69久久夜色精品国产69| 武侠古典久久婷婷狼人伊人| 午夜精品久久久久久毛片| 国产成人精品久久综合 | 人妻无码精品久久亚瑟影视| 亚洲精品蜜桃久久久久久| 国产午夜精品久久久久九九电影| 精品久久久久久国产| 国产AV影片久久久久久| 亚洲第一极品精品无码久久| 国产精品日韩欧美久久综合| 亚洲中文字幕无码久久综合网 | 国产精品久久久久9999| 一本久久免费视频| 热久久国产精品| 亚洲国产欧美国产综合久久| 久久久久久久国产免费看| 国产精品一区二区久久国产| 色播久久人人爽人人爽人人片AV| 久久最新精品国产| 7777久久亚洲中文字幕| 久久精品国产AV一区二区三区| 久久精品成人免费观看97| 丰满少妇高潮惨叫久久久| 亚洲色婷婷综合久久| 伊人久久亚洲综合影院| 精品久久久久中文字|