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

            高性能服務器開發;C++深探

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

            由于項目中經常遇到讀取配置文件的地方,為方便調用雖寫了個功能簡單,使用方便的配置文件類,基本思路是將配置文件緩沖到map當中,目前只支持一級配置,多級別的樹形配置暫不支持,有需要的兄弟請完善。
            為單實例模式。
            config2map.h
            // config2map.h
            // 配置文件到map的映射類,單實例模式
            // 創建: 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 ...
            并且使用統一的操作接口。  回復  更多評論   

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

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

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

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

            久久久免费观成人影院 | 久久se精品一区精品二区| 午夜天堂精品久久久久| 狠狠色婷婷综合天天久久丁香 | 久久人人爽人人人人片av| 色偷偷88888欧美精品久久久| 久久精品人人做人人爽97| 久久精品无码专区免费| 人妻无码中文久久久久专区| 亚洲乱亚洲乱淫久久| 久久精品国产色蜜蜜麻豆| 亚洲国产精品成人AV无码久久综合影院| 久久精品国产亚洲av麻豆蜜芽| 麻豆精品久久精品色综合| 色88久久久久高潮综合影院| 精品无码久久久久久久久久| 国产精品久久波多野结衣| 日韩人妻无码一区二区三区久久99| 女人香蕉久久**毛片精品| 久久久久国产精品人妻| 日日狠狠久久偷偷色综合0| 91久久福利国产成人精品| 奇米综合四色77777久久| 久久人人添人人爽添人人片牛牛| 国产亚洲精午夜久久久久久| 久久精品人人做人人妻人人玩| 国产香蕉久久精品综合网| 精品久久人人做人人爽综合| 久久99精品国产99久久| 国产精品99久久99久久久| 久久精品国产亚洲AV高清热| 久久久久久免费视频| 欧美精品乱码99久久蜜桃| 久久99九九国产免费看小说| 一级女性全黄久久生活片免费| 久久精品国产亚洲Aⅴ香蕉 | 久久婷婷色综合一区二区| 久久久久久亚洲精品不卡 | A级毛片无码久久精品免费| 久久狠狠色狠狠色综合| 99久久精品久久久久久清纯|