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

            Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

            路漫漫,長修遠,我們不能沒有錢
            隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
            數據加載中……

            為wince項目寫的一個可移植的ini文件讀寫的class[原創]

            //ini文件操作類
            //write by Khan
            //最開頭的注釋默認的 section為 "###"
            //普通的注釋和空行 key為"##"

            //所以 大家不要讓配置文件的key = "##"
            支持的注釋格式 "#注釋"


            //LIniFile.h
            #ifndef __LINI_FILE_H__
            #define __LINI_FILE_H__

            #include <string>
            #include <vector>
            #include <stdio.h>
            #include <utility>

            using namespace std;





            class CLogFileException{
                string m_strError;

            public:
                inline CLogFileException(string p_strError){ m_strError = m_strError; }
                inline string OnMessage(){ return this->m_strError; }
            };






            class LIniFile
            {
            public:
                LIniFile(const string p_strFileName);
                ~LIniFile(void);

            public:
                string GetValue(const string p_strSection, const string p_strKey);
                int SetValue(const string p_strSection, const string p_strKey, const string p_strValue);
                void Print();

                int OpenIni(const string p_strFileName);
                int OpenIni();
                void CloseIni();
            protected:


            private:
                vector<pair<string, pair<string,string> > >   m_szStrItem;
                string m_strFileName;
                FILE*  m_fileHandle;



              string TrimL(string p_strValue);
              string TrimR(string p_strValue);
              string Trim(string p_strValue);
              void LIniFile::DeleteEnter(char *p_str, int size);
            };

            #endif //__LINI_FILE_H__











            //LIniFile.cpp
            #include "LIniFile.h"
            #include <algorithm>


            LIniFile::LIniFile(const string p_strFileName)
            {
              this->m_strFileName = p_strFileName;
              this->m_fileHandle = NULL;
              //this->OpenIni(p_strFileName);
            }

            LIniFile::~LIniFile(void){
              //this->CloseIni();
            }

            int LIniFile::OpenIni(){
              return OpenIni(m_strFileName);
            }

            int  LIniFile::OpenIni(const string p_strFileName){
              this->m_fileHandle = fopen(p_strFileName.c_str(),"rt+");
              if (NULL == this->m_fileHandle) {
                return 0;
              }

              fseek(this->m_fileHandle, 0, SEEK_SET); //將文件指針指向文件開頭
              char cTemp[512];
              memset(cTemp, 0, sizeof(cTemp));

              vector<string> vecStrItem;
              int iLen = 0;

              while(NULL != fgets(cTemp, sizeof(cTemp), this->m_fileHandle)){
                DeleteEnter(cTemp, sizeof(cTemp));//去結尾回車符
                Trim(cTemp); //去前后空格
                string str = cTemp;
                vecStrItem.push_back(str);
              }

              this->CloseIni();
             
              pair<string, string> pKVItem;
              pair<string, pair<string, string> > pItem;
              string strSection = "";
              string strCurrentSection = "";

              for (unsigned int i = 0; i < vecStrItem.size(); i++) {
                string strLine = ((string)vecStrItem[i]);

                if( '[' == strLine[0] ){
                  strSection = strLine;

                  strSection = strSection.erase(0,1);
                  if(']' == strSection[strSection.size() -1 ])
                    strSection = strSection.erase(strSection.size() - 1 );
                  if (strCurrentSection != strSection)
                    strCurrentSection = strSection;
                 
              }else if( string::npos != strLine.find('=') ){
                  if ("" != strCurrentSection ) {
                    string strKey;
                    string strValue;
                    strKey = TrimR( strLine.substr(0, strLine.find('=')) );
                    strValue = TrimL( strLine.substr(strLine.find('=') + 1, strLine.size() - strLine.find('=')  ) );
                    pKVItem.first = strKey;
                    pKVItem.second = strValue;
                    pItem.first = strCurrentSection;
                    pItem.second = pKVItem;
                    m_szStrItem.push_back(pItem);
                  }
              }else{
                  if ("" != strCurrentSection ) {
                      string strKey = "##";
                      string strValue = TrimL( strLine );
                      pKVItem.first = strKey;
                      pKVItem.second = strValue;
                      pItem.first = strCurrentSection;
                      pItem.second = pKVItem;
                      m_szStrItem.push_back(pItem);
                }else{
                      string strKey = "##";
                      string strValue = TrimL( strLine );
                      pKVItem.first = strKey;
                      pKVItem.second = strValue;
                  pItem.first = "###";
                      pItem.second = pKVItem;
                      m_szStrItem.push_back(pItem);
                }
              }
              }

              return 1;
            }

            string LIniFile::GetValue(const string p_strSection, const string p_strKey){
              string strValue;
              for (unsigned i = 0; i< m_szStrItem.size(); i++) {
                if( p_strSection == (string) ( ((pair<string, pair<string, string> >)m_szStrItem[i]).first ) ){
                  pair<string, string> pKVItem = ((pair<string, pair<string, string> >)m_szStrItem[i]).second;
                  if ( p_strKey == (string)(pKVItem.first)) {
                    strValue = (string)(pKVItem.second);
                    break;
                  }
                }
              }
              return strValue;
            }


            void LIniFile::Print(){
              string strValue;
              string strKey;
              string strSection;
              for (unsigned i = 0; i< m_szStrItem.size(); i++) {
                strSection = (string) ( ((pair<string, pair<string, string> >)m_szStrItem[i]).first );
                pair<string, string> pKVItem = ((pair<string, pair<string, string> >)m_szStrItem[i]).second;
                strKey = (string)(pKVItem.first);
                strValue = (string)(pKVItem.second);
              //if((strSection != "###") && (strKey != "##") )
                printf("[%s]:%s=%s\n", strSection.c_str(), strKey.c_str(), strValue.c_str());
              }
            }


            void LIniFile::CloseIni(){
              if(NULL != this->m_fileHandle){
                fclose(this->m_fileHandle);
                this->m_fileHandle = NULL;
              }
            }


            string LIniFile::TrimL(string p_strValue){
              int i = 0 ;
              if ((i=(int)(p_strValue.length())) < 1)
                return "";

              i = 0;
              while(isspace(p_strValue[i])){
                i++ ;
              }
              p_strValue.erase(0,i);

              return p_strValue;
            }

            string LIniFile::TrimR(string p_strValue){
              int i = 0;
              if ( (i = (int)(p_strValue.length()-1)) < 1 )
                return "";

              while( ( p_strValue[i] ) == ' ' ){
                i--;
              }
              p_strValue.erase(i + 1);
              return p_strValue;
            }


            string LIniFile::Trim(string p_strValue){
              return TrimL(TrimR(p_strValue));
            }

            int LIniFile::SetValue(const string p_strSection, const string p_strKey, const string p_strValue){
              pair<string, string> pKVItem;
              pair<string, pair<string, string> > pItem;

              pKVItem.first = p_strKey;
              pKVItem.second = p_strValue;
              pItem.first = p_strSection;
              pItem.second = pKVItem;

              int bFind = 0;

              for(int i = (int)(m_szStrItem.size())-1; i >= 0; i--){ //找到已有的section, 并在末尾添加
                string bb = m_szStrItem[i].second.first;
                if((m_szStrItem[i].first == p_strSection)  && (m_szStrItem[i].second.first != "##")/* && (m_szStrItem[i].second.second != "")*/){
                  m_szStrItem.insert( m_szStrItem.begin()+ i+1, pItem );
                  bFind = 1;
                  break;
                }
              }

              if(bFind != 1) //如果是新增的section
                m_szStrItem.push_back(pItem);

              this->m_fileHandle = fopen(this->m_strFileName.c_str(),"wt+");
              //this->m_fileHandle = fopen("c:\\aaa.ini","wt+");
              if (NULL == this->m_fileHandle) {
                return 0;
              }

              string strCurSection = "";
              string strTmp = "";

              if((int)(m_szStrItem.size()) > 0){

                strCurSection = m_szStrItem[0].first;
                if(strCurSection != "###"){
                  strTmp = "[" + strCurSection + "]" + "\n";
                  fputs(strTmp.c_str(), this->m_fileHandle);
                }

                for(int i=0; i<(int)(m_szStrItem.size()); i++){
                  if( strCurSection ==  m_szStrItem[i].first ){

                    if((m_szStrItem[i].second.first == "##") && (m_szStrItem[i].second.second ==""))
                      strTmp = "\n";
                    else if((m_szStrItem[i].second.first == "##") && (m_szStrItem[i].second.second !=""))
                      strTmp = m_szStrItem[i].second.second+ "\n";
                    else
                      strTmp = m_szStrItem[i].second.first + " = " + m_szStrItem[i].second.second+ "\n";

                    fputs(strTmp.c_str(), this->m_fileHandle);
                  }else{

                    strCurSection = m_szStrItem[i].first;
                    if(strCurSection != "###"){
                      string strTmp = "[" + strCurSection + "]"+ "\n";
                      fputs(strTmp.c_str(), this->m_fileHandle);
                    }

                    if((m_szStrItem[i].second.first == "##") && (m_szStrItem[i].second.second ==""))
                      strTmp = "\n";
                    else if((m_szStrItem[i].second.first == "##") && (m_szStrItem[i].second.second !=""))
                      strTmp = m_szStrItem[i].second.second+ "\n";
                    else
                      strTmp = m_szStrItem[i].second.first + " = " + m_szStrItem[i].second.second+ "\n";

                    fputs(strTmp.c_str(), this->m_fileHandle);
                  }
                }
              }
              this->CloseIni();
              return 1;
            }




            void LIniFile::DeleteEnter(char *p_str, int size){
              int i_len = (int)(strlen(p_str));
              if(p_str[i_len-1] == 0x0d || p_str[i_len-1] == 0x0a)
                p_str[i_len-1] = 0x00;

              i_len =  (int)(strlen(p_str));
              if(p_str[i_len-1] == 0x0d || p_str[i_len-1] == 0x0a)
                p_str[i_len-1] = 0x00;
            }




            調用方式

            #include "LIniFile.h"


            int main(int argc, char** argv)
            {
                LIniFile ini("d:\\My Documents\\Visual Studio 2005\\Projects\\inifile\\cbm.ini");
                ini.OpenIni();
                ini.SetValue("cbm","a", "b");
                ini.SetValue("aaa","a", "b");

                ini.Print();
                ini.CloseIni();

                getchar();
                return 0;
            }


            處理前的日志文件內容
             1 ## cbm配置文件
             2 
             3 [cbm]
             4 
             5 #sp端口號
             6 sp_port = 07554400001
             7 
             8 # 開通的頻道列表
             9 channels = 2001,2002,2003,2004
            10 
            11 #rsa私鑰
            12 rsa_key1 = 0004b831414e0b4613922bd35b4b36802bc1e1e81c95a27c958f5382003df646154ca92fc1ce02c3be047a45e9b02a9089b4b90278237c965192a0fcc86bb49bc82ae6
            13 rsa_key2 = fdc2de709006b86c7676efdf597626fad633a4f7dc48c445d37eb55fcb3b1abb95baaa826d5390e15fd14ed403fa2d0cb841c650609524ec555e3bc56ca95700000000
            14 rsa_key3 = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
            15 rsa_key4 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001
            16 
            17 
            18 [2001]
            19 flag = 1
            20 des3_key1 = 3e072bb9698439377cea73f33e0d5c5af1f5ce581f8e585ac4df2e98c8627e84fea8dbfc2ad4e66375187ab021aedc094c37196534c41611262419bfd07822a3ee
            21 des3_key2 = a2bd32dd13ffc59535d99e2ae79c866f308fbd1de7466034f4ed3742651731d307e95a1e9e838e5c77f135124c0714efe06cb7c596a6c35e64eb7572b1737b
            22 
            23 [2002]
            24 flag = 1
            25 des3_key1 = 3e072bb9698439377cea73f33e0d5c5af1f5ce581f8e585ac4df2e98c8627e84fea8dbfc2ad4e66375187ab021aedc094c37196534c41611262419bfd07822a3ee
            26 des3_key2 = a2bd32dd13ffc59535d99e2ae79c866f308fbd1de7466034f4ed3742651731d307e95a1e9e838e5c77f135124c0714efe06cb7c596a6c35e64eb7572b1737b
            27 
            28 [2003]
            29 flag = 1
            30 des3_key1 = 3e072bb9698439377cea73f33e0d5c5af1f5ce581f8e585ac4df2e98c8627e84fea8dbfc2ad4e66375187ab021aedc094c37196534c41611262419bfd07822a3ee
            31 des3_key2 = a2bd32dd13ffc59535d99e2ae79c866f308fbd1de7466034f4ed3742651731d307e95a1e9e838e5c77f135124c0714efe06cb7c596a6c35e64eb7572b1737b
            32 
            33 [2004]
            34 flag = 1
            35 des3_key1 = 3e072bb9698439377cea73f33e0d5c5af1f5ce581f8e585ac4df2e98c8627e84fea8dbfc2ad4e66375187ab021aedc094c37196534c41611262419bfd07822a3ee
            36 des3_key2 = a2bd32dd13ffc59535d99e2ae79c866f308fbd1de7466034f4ed3742651731d307e95a1e9e838e5c77f135124c0714efe06cb7c596a6c35e64eb7572b1737b


            處理后的ini內容
             1 ## cbm配置文件
             2 
             3 [cbm]
             4 
             5 #sp端口號
             6 sp_port = 07554400001
             7 
             8 # 開通的頻道列表
             9 channels = 2001,2002,2003,2004
            10 
            11 #rsa私鑰
            12 rsa_key1 = 0004b831414e0b4613922bd35b4b36802bc1e1e81c95a27c958f5382003df646154ca92fc1ce02c3be047a45e9b02a9089b4b90278237c965192a0fcc86bb49bc82ae6
            13 rsa_key2 = fdc2de709006b86c7676efdf597626fad633a4f7dc48c445d37eb55fcb3b1abb95baaa826d5390e15fd14ed403fa2d0cb841c650609524ec555e3bc56ca95700000000
            14 rsa_key3 = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
            15 rsa_key4 = 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010001
            16 
            17 
            18 [2001]
            19 flag = 1
            20 des3_key1 = 3e072bb9698439377cea73f33e0d5c5af1f5ce581f8e585ac4df2e98c8627e84fea8dbfc2ad4e66375187ab021aedc094c37196534c41611262419bfd07822a3ee
            21 des3_key2 = a2bd32dd13ffc59535d99e2ae79c866f308fbd1de7466034f4ed3742651731d307e95a1e9e838e5c77f135124c0714efe06cb7c596a6c35e64eb7572b1737b
            22 
            23 [2002]
            24 flag = 1
            25 des3_key1 = 3e072bb9698439377cea73f33e0d5c5af1f5ce581f8e585ac4df2e98c8627e84fea8dbfc2ad4e66375187ab021aedc094c37196534c41611262419bfd07822a3ee
            26 des3_key2 = a2bd32dd13ffc59535d99e2ae79c866f308fbd1de7466034f4ed3742651731d307e95a1e9e838e5c77f135124c0714efe06cb7c596a6c35e64eb7572b1737b
            27 = b
            28 
            29 [2003]
            30 flag = 1
            31 des3_key1 = 3e072bb9698439377cea73f33e0d5c5af1f5ce581f8e585ac4df2e98c8627e84fea8dbfc2ad4e66375187ab021aedc094c37196534c41611262419bfd07822a3ee
            32 des3_key2 = a2bd32dd13ffc59535d99e2ae79c866f308fbd1de7466034f4ed3742651731d307e95a1e9e838e5c77f135124c0714efe06cb7c596a6c35e64eb7572b1737b
            33 
            34 [2004]
            35 flag = 1
            36 des3_key1 = 3e072bb9698439377cea73f33e0d5c5af1f5ce581f8e585ac4df2e98c8627e84fea8dbfc2ad4e66375187ab021aedc094c37196534c41611262419bfd07822a3ee
            37 des3_key2 = a2bd32dd13ffc59535d99e2ae79c866f308fbd1de7466034f4ed3742651731d307e95a1e9e838e5c77f135124c0714efe06cb7c596a6c35e64eb7572b1737b
            38 
            39 [aaa]
            40 = b
            41 


            posted on 2007-08-07 10:06 Khan 閱讀(4579) 評論(12)  編輯 收藏 引用 所屬分類: GCC/G++ 、跨平臺開發

            評論

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            我使用CIniFile, 是用stl實現的,應該能用于wince。好像是從CodeProject下載的。
            2007-08-07 13:26 | 金慶

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            strKey = (string)(pKVItem.first);
            完全的java風格嘛。。。
            2007-08-07 19:59 | 羅賓李

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            to 金慶
            之前寫過一個純c的版本..但是由于寫ini實在太復雜了..所以就廢了..

            to 羅賓李
            對..我是遵照java的ini文件格式來實現的
            2007-08-09 09:35 | Khan's Notebook

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            這段代碼沒有實現修改對應key的value. 如果需要完整版本.請向我索取
            2007-08-09 09:45 | Khan's Notebook

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            wince 不支持STL,這個代碼需要改造
            2007-08-25 21:12 | peng.jun

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            sorry, 我沒說太清楚, 我對應的系統是win mobile 5, 代碼經過測試..是可以正常運行的..
            2007-08-27 10:02 | Khan's Notebook

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            測試了一下發現
            如果你在同一個小節下面寫10個相同名稱的鍵(Key),并分別設置不同的鍵值,那么在這個小節下會出現10個鍵名相同但鍵值不同的項目, 那么在讀取這個鍵的值的時候,因為存在10個相同鍵名的項,應該返回哪個值呢??????
            上面的源碼中SetValue函數好像并不會去檢測小節中是否已經存在這個鍵名(Key).
            2007-09-16 17:14 | Jim.Liang

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            正確的方法應該是在寫入一個Key的值的時候先檢測一下小節下是否存在Key,如果存在,則用傳入的Key的值更新已有的Key的值,如果不存在Key,則添加Key和對應的值.
            2007-09-16 17:16 | Jim.Liang

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            sorry. 我再仔細查查..謝謝樓上達人指出
            2007-09-18 16:14 | Khan's Notebook

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            這個是最開始的版本.剛剛想起來.我發布后不久就調試出這個問題.并進行了改進..我遲一點會更新為最新的版本
            2007-09-18 16:15 | Khan's Notebook

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            不大懂...wince下不是UNICODE環境么,可以直接用string讀到ini的值么
            2008-07-11 10:16 | EUREKA

            # re: 為wince項目寫的一個可移植的ini文件讀寫的class[原創]  回復  更多評論   

            @EUREKA
            win98是ansi環境, 并不表示win98下不能寫unicode的文件..
            2008-07-15 16:42 | Khan's Notebook
            久久久91人妻无码精品蜜桃HD | 久久久久高潮综合影院| 久久久精品人妻一区二区三区蜜桃 | 久久精品国产亚洲AV大全| 久久91综合国产91久久精品| 久久99国产一区二区三区| 7777精品伊人久久久大香线蕉| 久久综合狠狠综合久久| 久久久久久久综合综合狠狠| 日产精品久久久一区二区| 久久99精品九九九久久婷婷 | 久久99精品国产一区二区三区| 久久99精品九九九久久婷婷| 久久人人爽人人爽人人片av高请 | 国产激情久久久久影院老熟女| 亚洲精品久久久www| 国产精品九九久久免费视频| 日本人妻丰满熟妇久久久久久| 久久久久国产成人精品亚洲午夜| 国产精品99久久免费观看| 亚洲精品午夜国产va久久| 狠狠人妻久久久久久综合| 777米奇久久最新地址| 中文无码久久精品| 久久人人爽人人爽人人片AV麻烦| 一本久久a久久精品综合夜夜| 精品综合久久久久久888蜜芽| 久久久久久久久波多野高潮| 青春久久| 久久99九九国产免费看小说| 久久亚洲中文字幕精品一区四| 久久国产精品免费一区二区三区| 国产欧美一区二区久久| 国内精品久久久久久野外| 久久免费美女视频| 91精品国产高清久久久久久国产嫩草| 国产精品对白刺激久久久| 国产精品久久99| 久久www免费人成看国产片| 久久精品国产99久久香蕉| 久久久国产精华液|