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

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            用STL快速編寫ini配置文件識別類

            作者:Winter

            ini文件是技術(shù)人員經(jīng)常用到的一種系統(tǒng)配置方法,如何讀取和快速識別ini文件中的內(nèi)容實現(xiàn)起來比較繁瑣。STL強大的功能在于能快速的實現(xiàn)排序、查找、 識別等功能。本文通過STL中的map,string,vector,ifstream等,來快速實現(xiàn)ini文件的識別類class IniFile?。IniFile可以實現(xiàn)常見查找功能,并提供完整的源碼。

            1 設(shè)計需求:

            ini文件的格式一般如下:

            [section1]
            key1=value1
            key2=value2
            ......
            
            [section2]
            key1=value1
            key2=value2    #注釋
            ......
            實際的例子是:
            
            
            #ini?for?path
            [path]
            dictfile?
            =?/home/tmp/dict.dat
            inputfile
            =?/home/tmp/input.txt
            outputfile
            =?/home/tmp/output.txt

            #ini?
            for?exe
            [exe]
            user
            =?winter???????//user?name
            passwd=?1234567????#pass?word
            database
            =?mydatabase

            其中有五種元素:section 名,Key名,value值,注釋 #或者//開頭,標志字符"[" "]" "="。查找項的對應(yīng)關(guān)系為sectiong-key和value對應(yīng)。需要得到是value。class IniFile?要實現(xiàn)的是兩個函數(shù):讀入ini文件,讀取sect-key對應(yīng)的value值。即實現(xiàn)下面的接口:

            class?IniFile{
            public:
            ????IniFile();
            ????
            //打開ini文件
            ????bool?open(const?char*?pinipath);
            ????
            //讀取value值
            ????const?char*?read(const?char*?psect,?const?char*pkey);
            ??}
            ;

            2 設(shè)計實現(xiàn):

            用ifstream按行讀入ini文件的內(nèi)容

            識別每一行的字符串,分析出sectiong,key,value,和注釋。

            用map >來記錄所有的sectiong-key和value。

            重新定義class IniFile?

            typedef?map<string,?string,?less<string>?>?strMap;
            typedef?strMap::iterator?strMapIt;

            const?char*const?MIDDLESTRING?=?"_____***_______";
            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
            <string>?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;
            }
            ;

            其中do_open是用來真正實現(xiàn)初始化ini內(nèi)容的函數(shù)。先用ifstream fin打開一個文件,然后用is_open判斷文件是否正常打開。順序讀取文件的時候用eof()判斷是否到文件尾。getline是一個字符處理函數(shù):直接從fin中讀取一行。然后用while循環(huán)過濾一行末尾的空格等字符。最后保存到一個vector中,完成讀入文本工作。其中比較值得關(guān)注的是以下為體,你知道為什么這么做么?

            • 用ifstream和getline來讀入而不是用fopen和fread。
            • 用is_open判斷是否打開,而不是直接讀取。
            • 用vector的push_pack而不是insert。
            • 用empty判斷是否為空,而不是用size()==0。

            下一步用for_each函數(shù)來完成字符串的內(nèi)容提取工作。聲明一個結(jié)構(gòu),實現(xiàn)對操作符()的重載。代碼如下:

            truct?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?))?!=?string::npos)?||
            ????????????((last?
            =?strtmp2.find("?#",?first?))?!=?string::npos)?||
            ????????????((last?
            =?strtmp2.find("\t//",?first?))?!=?string::npos)||
            ????????????((last?
            =?strtmp2.find("?//",?first?))?!=?string::npos))
            ????????
            {
            ????????????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?;
            ????}

            }
            ;
            這里大量使用了字符串的查找和字串功能。string的find_last_of系列和find系列,功能確實十分強大。所有在string中沒有找到都會返回一個變量string::npos。

            函數(shù)先找sectiong,然后分離key值和value值。符合要求的,把section和key值通過中間加上MIDDLESTRING組成一個新的string,插入map中。這里值得注意的是:

            * for_each的使用,結(jié)構(gòu)可以傳遞參數(shù)。 * string的查找函數(shù)及返回值 * string的鏈接和合并函數(shù)。 * map的下標操作符的使用。

            3 具體使用

            把所有代碼放在一個頭文件中,以后別人使用的時候,只需要包含頭文件就可以了,點擊查看inifile.h文件。在使用的過程中,注意判斷返回值。使用代碼如下:

            #include?<iostream>
            #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="<<strvalue<<endl;
            ????
            return?0;
            }
            ????


            • Set MYTITLE = 用STL快速編寫ini配置文件識別類

            posted on 2006-04-25 22:28 楊粼波 閱讀(544) 評論(0)  編輯 收藏 引用 所屬分類: 文章收藏

            久久香蕉国产线看观看99| 欧美一区二区精品久久| 久久精品国产国产精品四凭| 久久99精品久久久久久久不卡 | 久久久久久精品免费免费自慰| 三级三级久久三级久久| 久久性精品| 合区精品久久久中文字幕一区 | 久久夜色撩人精品国产| 伊人热人久久中文字幕| 国产99久久九九精品无码| 国产精品久久久99| 久久精品亚洲男人的天堂| 久久久久亚洲AV成人网人人网站 | 天天躁日日躁狠狠久久| 一本色综合网久久| 久久久久久亚洲AV无码专区| 97久久久久人妻精品专区| 97久久精品无码一区二区| 久久久九九有精品国产| 国产精品女同一区二区久久| 久久亚洲精品无码播放| 波多野结衣久久一区二区| 亚洲AV日韩AV天堂久久| 久久亚洲私人国产精品vA| 久久成人精品视频| 久久人妻无码中文字幕| 久久综合给合久久狠狠狠97色69| 久久久久久国产精品无码超碰| 久久国产精品久久| 四虎亚洲国产成人久久精品| 中文字幕久久精品无码| 久久免费美女视频| 亚洲va久久久久| 粉嫩小泬无遮挡久久久久久| 国产精品欧美亚洲韩国日本久久 | 亚洲愉拍99热成人精品热久久| 99久久精品费精品国产一区二区| 久久久艹| 国产精品福利一区二区久久| 久久免费视频6|