• <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 閱讀(3702) 評論(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

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

            中文字幕无码av激情不卡久久| 久久w5ww成w人免费| 色综合久久综合网观看| 精品无码久久久久久久动漫| 伊人久久大香线蕉综合网站| 午夜精品久久久久久毛片| 婷婷伊人久久大香线蕉AV| 国产叼嘿久久精品久久| 麻豆av久久av盛宴av| 久久精品人成免费| 精品久久人人妻人人做精品| 一本色道久久88精品综合| 热99re久久国超精品首页| 婷婷国产天堂久久综合五月| 亚洲成色999久久网站| 99久久国产宗和精品1上映| 久久99精品九九九久久婷婷| 精品久久久久久中文字幕人妻最新| 久久久久99精品成人片三人毛片| 久久久噜噜噜久久熟女AA片| 2021久久精品免费观看| 久久国产福利免费| 老司机国内精品久久久久| 久久久噜噜噜久久熟女AA片| 久久精品国产亚洲AV不卡| 国产精品亚洲综合久久| 久久WWW免费人成—看片| 国产三级精品久久| 久久九九亚洲精品| 色综合久久综合网观看| 99久久免费只有精品国产| 色综合久久88色综合天天| 国产精品久久久久9999| 久久久久亚洲av无码专区| 久久夜色精品国产噜噜亚洲AV| 婷婷久久香蕉五月综合加勒比| 久久天天躁狠狠躁夜夜不卡| 久久久久久国产a免费观看黄色大片 | 777久久精品一区二区三区无码| 国产三级久久久精品麻豆三级 | 国产人久久人人人人爽|