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

            路漫漫,長修遠(yuǎn),我們不能沒有錢
            隨筆 - 173, 文章 - 0, 評(píng)論 - 257, 引用 - 0
            數(shù)據(jù)加載中……

            symbian 的ini文件類.

            //2007.12.22 修正


            //CFile.h

            #ifndef __C_FILE_H__
            #define __C_FILE_H__

            #include <f32file.h>
            #include <badesca.h>



            class CFile:public CBase
            {

            public:
              static CFile *NewL(const TDesC &p_fileName);
              static CFile *NewLC(const TDesC &p_fileName);
              CFile(const TDesC& p_fileName);
              ~CFile();

            public:
              void ConstructL(TUint p_shareMode);
              TInt FPuts(const TDesC8 &aDes);
              TInt FGets(TDes8 &aDes) const;
              TInt FSeek(TSeek aMode, TInt &aPos) const;
              TInt FSetSize(TInt aSize);
              TInt FileSize() const;
              void DostroyL();
             
            public:
              static void GetDirFiles(const TDesC &path, CDesCArray& files);
              static void LogToFile(const TDesC& filename,TDesC8&  pdu);
              //static void LogToFile(const TDesC& filename,TDesC&  pdu);
              static void GetLinesFromFile(const TDesC& filename,CDesCArray&  lines);
              static void GetLinesFromFile(const TDesC& filename,CDesC8Array&  lines);
              static bool MakeCbmDir(const TDesC& aPath);
            protected:
              TBuf<128> mFileName;
              RFs fs;
              RFile file;
              TInt mFileSize;
             
            };


            #endif //__C_FILE_H__




            //CFile.cpp

            #include "CFile.h"

            #include <bautils.h>
            #include <utf.h>

            _LIT8(KCRLF, "\r\n");

            CFile *CFile::NewL(const TDesC &p_fileName)
            {
              CFile *self = CFile::NewLC(p_fileName);
              CleanupStack::Pop(self);
              return self;
            }


            CFile *CFile::NewLC(const TDesC &p_fileName)
            {
              CFile *self = new(ELeave) CFile(p_fileName);
              CleanupStack::PushL(self);
              return self;
            }


            CFile::CFile(const TDesC &p_fileName)
            {
              mFileName.Copy(p_fileName);
              mFileSize = 0;
            }

            CFile::~CFile()
            {
               
            }

            void CFile::ConstructL(TUint p_shareMode)
            {
              User::LeaveIfError(fs.Connect() );
              TInt err = file.Open( fs, mFileName, p_shareMode);
             
              if(err==KErrNotFound) // file does not exist - create it
                err=file.Create(fs, mFileName, p_shareMode);
             
              file.Size(mFileSize);
            }



            TInt CFile::FileSize() const
            {
                return mFileSize;
            }



            TInt CFile::FPuts(const TDesC8 &aDes)
            {
              return file.Write(aDes);
            }




            TInt CFile::FGets(TDes8 &aDes) const
            {
              return file.Read(aDes);
            }


            TInt CFile::FSeek(TSeek aMode, TInt &aPos) const
            {
              return file.Seek(aMode, aPos);
            }

            TInt CFile::FSetSize(TInt aSize)
            {
              return file.SetSize(aSize);
            }

            void CFile::DostroyL()
            {
              file.Close();
              fs.Close();
            }



            bool  CFile::MakeCbmDir(const TDesC& aPath){
                RFs fs;
                User::LeaveIfError(fs.Connect() );
             
                if( BaflUtils::FolderExists(fs,aPath)  ){
                    fs.Close();
                    return true;
                }
                if(KErrNone==fs.MkDirAll(aPath) ){
                    fs.Close();
                    return  true;
                }
               
                fs.Close();
                return false;
            }


            void CFile::GetDirFiles(const TDesC& path,CDesCArray&  files)
            {
              RFs fs;
              User::LeaveIfError(fs.Connect() );

              if( BaflUtils::FolderExists(fs,path)  ){
                CDir* dir=NULL;
                User::LeaveIfError( fs.GetDir(path, KEntryAttNormal|KEntryAttMatchMask, ESortByName, dir) );
                TInt ii=dir->Count();
                for(TInt i=0;i<ii;i++){
                  TEntry aEntry=(*dir)[i];
                  TBuf<256> filePath(path);
                  filePath.Append(aEntry.iName);
                  files.AppendL(filePath);
                }
              }
              fs.Close();
            }


            void CFile::LogToFile(const TDesC& filename,TDesC8&  pdu)
            {
              //_LIT(name, "C:\\log.txt");
              //TBuf<32> filename(name);
              RFs fs;
              RFile file;

              User::LeaveIfError(fs.Connect() );
              //CleanupClosePushL(fs); 
              //CleanupClosePushL(file); 

              TUint shareMode=EFileRead | EFileWrite ;
              TInt err= file.Open( fs, filename,shareMode ) ;

              if(err==KErrNotFound) // file does not exist - create it
                err=file.Create(fs,filename,shareMode);
              TInt pos;
              file.Seek(ESeekEnd,pos);

              if(err!=KErrNotFound)
                file.Write(pos,_L8("\r\n"));

              file.Seek(ESeekEnd,pos);
              file.Write(pos,pdu);
              //CleanupStack::PopAndDestroy(2,&fs);

              file.Close();
              fs.Close();
            }



            void CFile::GetLinesFromFile(const TDesC& filename,CDesCArray&  lines){
              RFs fs;
              User::LeaveIfError(fs.Connect() );
              if( BaflUtils::FileExists(fs,filename)  ){
                //open file
                RFile file;
                TUint shareMode=EFileRead | EFileWrite ;
                file.Open( fs, filename,shareMode ) ;

                TInt fileSize=0;
                file.Size(fileSize);  //取得文件大小

                CnvUtfConverter *cutf=new (ELeave) CnvUtfConverter;

                HBufC8 *bufc = HBufC8::NewL(fileSize+1);

                file.Read( (TDes8&) (bufc->Des()) ) ;

                //LogToFile(_L("c:\\cbm\\rsadebug.txt"), bufc->Des());//

                TInt res;
                TPtrC8 iCursor(bufc->Des());
                TBuf<256>  buf16;
                   
                //TBuf8<2> bufPage;
                //bufPage.Format(_L8("%02d"), res);
                //LogToFile(_L("c:\\cbm\\rsadebug.txt"), bufPage);

                while( ( res = iCursor.FindF(KCRLF) ) >= 0 ) {
                  res = iCursor.FindF(KCRLF);
                  TPtrC8 result = iCursor.Left(res);
                  iCursor.Set(iCursor.Right(iCursor.Length() - (res +2)));
                       
                  buf16.Zero();
                  buf16=cutf->ConvertToUnicodeFromUtf8L(result)->Des();
                       
                  lines.AppendL(buf16);
                }

                if(iCursor.Size()>0) {
                  buf16.Zero();
                  buf16=cutf->ConvertToUnicodeFromUtf8L(iCursor)->Des();
                  lines.AppendL(buf16);
                }

                delete cutf;
                delete  bufc;
                file.Close();
              }
              fs.Close();
            }


            void CFile::GetLinesFromFile(const TDesC& filename,CDesC8Array&  lines){
              RFs fs;
              User::LeaveIfError(fs.Connect() );
              if( BaflUtils::FileExists(fs,filename)  ){
                //open file
                RFile file;
                TUint shareMode=EFileRead | EFileWrite ;
                file.Open( fs, filename,shareMode ) ;   
                TInt fileSize=0;
                file.Size(fileSize);

                CnvUtfConverter *cutf=new (ELeave) CnvUtfConverter;

                HBufC8 *bufc = HBufC8::NewL(fileSize+1);
                file.Read( (TDes8&) (bufc->Des()) );

                //LogToFile(_L("c:\\cbm\\rsadebug.txt"), bufc->Des());//

                TInt res;
                TPtrC8 iCursor(bufc->Des());

                while( ( res = iCursor.FindF(KCRLF) ) >= 0 ){  //有可能位置是從0開始的 如果有問題.再改成 >0
                  TPtrC8 result = iCursor.Left(res);
                  iCursor.Set(iCursor.Right(iCursor.Length() - (res +2)));

                  lines.AppendL(result);
                }
                   
                if(iCursor.Size()>0) {
                  lines.AppendL(iCursor);
                }

                delete cutf;

                delete  bufc;
                file.Close();
              }
              fs.Close();
            }

            //file end




            //CIniFile.h

            #ifndef __C_INI_FILE_H__
            #define __C_INI_FILE_H__

            #include <e32base.h>  //CArrayPtrFlat

            #include "util/CFile.h"


            typedef struct tagINIElement
            {
                TBuf8<40>   _Section;
                TBuf8<40>   _Key;
                TBuf8<512>  _Value;
            }IniElement;



            class CIniFile :public  CFile
            {
            public:
              static CIniFile* NewL(const TDesC &p_fileName);
              static CIniFile* NewLC(const TDesC &p_fileName);
              CIniFile(const TDesC &p_fileName);
              ~CIniFile();
             
             
              TInt OpenIni();
              TInt GetValue(const TDesC8 &p_Section, const TDesC8 &p_Key, TDes8 &p_Value );
              TInt PutValue(const TDesC8 &p_Section, const TDesC8 &p_Key, const TDesC8 &p_Value ); 
              void WriteIni();
              void CloseIni();

              void DostroyL();
            private:
              CArrayPtrFlat<IniElement> *m_pIniElements;
            };

            #endif //__C_INI_FILE_H__



            //CIniFile.cpp

            #include "CIniFile.h"


            CIniFile *CIniFile::NewL(const TDesC &p_fileName)
            {
              CIniFile *self = CIniFile::NewLC(p_fileName);
              CleanupStack::Pop(self);
              return self;
            }



            CIniFile *CIniFile::NewLC(const TDesC &p_fileName)
            {
              CIniFile *self = new(ELeave) CIniFile(p_fileName);
              CleanupStack::PushL(self);
              return self;
            }



            CIniFile::CIniFile(const TDesC &p_fileName):CFile(p_fileName)
            {
              m_pIniElements = NULL;
            }



            void CIniFile::DostroyL()
            {
               for(int i = 0; i<m_pIniElements->Count(); i++)
                 delete m_pIniElements->At(i);
                
               delete m_pIniElements;
            }



            CIniFile::~CIniFile()
            {
              DostroyL();
            }




            TInt CIniFile::OpenIni()
            {
              ConstructL(EFileRead | EFileWrite) ;
              TInt pos=0;
              FSeek(ESeekStart,pos);
             
              HBufC8 *bufc = HBufC8::NewL(mFileSize + 3); //包含最末尾添加的\r\n
             
              FGets( (TDes8&)(bufc->Des()) );       //讀出所有文件內(nèi)容
              bufc->Des().Append(_L8("\r\n"));
             
              TPtrC8 iCursor(bufc->Des()); //指向文件內(nèi)容的指針
             
              TInt iPos = 0;
             
              m_pIniElements = new(ELeave) CArrayPtrFlat<IniElement>(20);
             
              TBuf8<40>   szCurSection(_L8(""));
              TBuf8<40>   szSection(_L8(""));

              while( ( iPos = iCursor.FindF(_L8("\r\n")) ) >= 0 ) {
                iPos = iCursor.FindF(_L8("\r\n"));
                TPtrC8 result = iCursor.Left(iPos); //取出一行內(nèi)容
               
                HBufC8 *pTmp = HBufC8::NewL(result.Length());
                pTmp->Des().Copy(result);
                pTmp->Des().Trim();

               
                if((pTmp->Des().Length() > 0) && pTmp->Des()[0] == '[') //查找section
                {
                   
                  pTmp->Des().Delete(0, 1);

                  if( pTmp->Des()[pTmp->Des().Length() -1 ] == ']')
                    pTmp->Des().Delete(pTmp->Des().Length()-1, 1);
               
                  szSection.Copy(pTmp->Des());
               
                  if (szCurSection != szSection)
                    szCurSection = szSection;
                } else if( KErrNotFound != pTmp->Des().Find(_L8("=")) )  //key=value
                {
                  if (szCurSection.Compare(_L8("")) != 0)
                  {
                    IniElement *element = new(ELeave) IniElement;
                    element->_Section.Copy(szCurSection) ;
                   
                    TPtrC8 ptrKey(pTmp->Des());
                    TInt iKeyPos=0;
                    iKeyPos = ptrKey.FindF(_L8("="));
                    TPtrC8 ptrTmpKey = ptrKey.Left(iKeyPos);
                   
                    element->_Key.Copy(ptrTmpKey);
                    element->_Key.Trim();
                   
                    ptrKey.Set( ptrKey.Right(ptrKey.Length() - iKeyPos -1) );
                    element->_Value.Copy(ptrKey);
                    element->_Value.Trim();
                   
                    m_pIniElements->AppendL(element);
                  }
                } else   //注釋,,空行等無用數(shù)據(jù)
                {
                  if (szCurSection.Compare(_L8("")) ==0 ) //沒有section的注釋空行..在文件開頭
                  {
                    IniElement *element = new(ELeave) IniElement;
                    element->_Section.Copy(_L8("###"));
                    element->_Key.Copy(_L8("##"));
                    element->_Value.Copy(pTmp->Des());
                    m_pIniElements->AppendL(element);
                  } else   //section中的注釋空行
                  {
                      IniElement *element = new(ELeave) IniElement;
                      element->_Section.Copy(szCurSection);
                      element->_Key.Copy(_L8("##"));
                    element->_Value.Copy(pTmp->Des());
                    m_pIniElements->AppendL(element);
                  }
                }
               
                delete pTmp;
                iCursor.Set( iCursor.Right(iCursor.Length() - (iPos +2)) );//
              }
              delete bufc;
              CloseIni();  //關(guān)閉文件句柄
              return 1;
            }


            TInt CIniFile::GetValue(const TDesC8 &p_Section, const TDesC8 &p_Key, TDes8 &p_Value )
            {
              for(int i=0; i<m_pIniElements->Count(); i++)
              {
                  if(  (m_pIniElements->At(i)->_Section.Compare( (TDesC8&)p_Section ) ==0 ) &&
                      (m_pIniElements->At(i)->_Key.Compare( (TDesC8&)p_Key ) ==0 ) )
                 
                  {
                    p_Value.Copy(m_pIniElements->At(i)->_Value);
                  return 1;
                  }
              }
              return 0;
            }
             
             
             
             
            TInt CIniFile::PutValue(const TDesC8 &p_Section, const TDesC8 &p_Key, const TDesC8 &p_Value )
            {
              IniElement *element = new(ELeave) IniElement;
              element->_Section.Copy(p_Section);
              element->_Key.Copy(p_Key);
              element->_Value.Copy(p_Value);
             
             
              TInt b_KeyFind = 0;
              for(int i = 0; i<m_pIniElements->Count(); i++)
              { 
                //IniElement *tmp = m_pIniElements->At(i);
                if( (m_pIniElements->At(i)->_Section.Compare( (TDesC8&)p_Section ) ==0 ) &&
                      (m_pIniElements->At(i)->_Key.Compare( (TDesC8&)p_Key ) ==0 ))
                {
                  m_pIniElements->At(i)->_Value.Copy(p_Value);
                  b_KeyFind = 1;
                  break;
                }
              }
             
              if(0 == b_KeyFind)
              {
                TInt b_secFind = 0;
                for(int i=0; i<m_pIniElements->Count(); i++)
                {
                  if( (m_pIniElements->At(i)->_Section.Compare( (TDesC8&)p_Section ) ==0) &&
                        (m_pIniElements->At(i)->_Key.Compare( _L8("##")) != 0) ) 
                    {
                      m_pIniElements->InsertL(i+1, element);
                      b_secFind  = 1;
                    break;
                    }
                }
               
                if(b_secFind  != 1) //如果是新增的section
                  m_pIniElements->AppendL(element);
              }
            //輸出調(diào)試
              /*for(int i=0; i<m_pIniElements->Count(); i++)
              {
                TBuf8<512> dd;
                dd.Format(_L8("%S %S %S\r\n"), &(m_pIniElements->At(i)->_Section), &(m_pIniElements->At(i)->_Key), &(m_pIniElements->At(i)->_Value));
                CFile::LogToFile(_L("c:\\stock\\debugini.txt"), dd);
              }
              */

             
              //將內(nèi)存中的ini覆寫回文件
              ConstructL(EFileRead | EFileWrite);
              TInt pos;
              FSeek(ESeekStart,pos);
              FSetSize(0);
             
              WriteIni();
             
              CloseIni();  //關(guān)閉文件句柄
              return 1;
            }


            void CIniFile::WriteIni()
            {
              if(m_pIniElements->Count()>0)
              {
                TBuf8<40>   szCurSection(_L8(""));
               
                HBufC8 *strm = HBufC8::NewL(255);
                strm->Des().Zero();
             
                szCurSection.Copy(m_pIniElements->At(0)->_Section);
                if(szCurSection.Compare( _L8("###")) != 0)//文件開頭的注釋和空行
                {
                  strm->Des().Format(_L8("[%S]\r\n"), &szCurSection);
                  FPuts(strm->Des());
                }

                for(int i=0; i<m_pIniElements->Count(); i++)
                {
                  IniElement *etmp = m_pIniElements->At(i);
                  if(etmp->_Section.Compare(szCurSection) == 0) //如果查到當(dāng)前塊的子項(xiàng)
                  {
                    if( (etmp->_Key.Compare(_L8("##")) == 0 ) && (etmp->_Value.Compare(_L8("")) == 0 ))
                      {
                        FPuts( _L8("\r\n"));
                      } else if( (etmp->_Key.Compare(_L8("##")) == 0 ) && (etmp->_Value.Compare(_L8("")) != 0 ))
                      {
                        strm->Des().Format(_L8("%S\r\n"), &(etmp->_Value));
                      FPuts(strm->Des());
                      } else
                      {
                        strm->Des().Format(_L8("%S = %S\r\n"), &(etmp->_Key), &(etmp->_Value));
                      FPuts(strm->Des());
                      }
                  } else
                  {
                    szCurSection.Copy(etmp->_Section);
                    if(szCurSection.Compare( _L8("###")) != 0)
                    {
                      strm->Des().Format(_L8("[%S]\r\n"), &szCurSection);
                      FPuts(strm->Des());
                    }
                   
                      if( (etmp->_Key.Compare(_L8("##")) == 0 ) && (etmp->_Value.Compare(_L8("")) == 0 ))
                      {
                        FPuts( _L8("\r\n"));
                      } else if( (etmp->_Key.Compare(_L8("##")) == 0 ) && (etmp->_Value.Compare(_L8("")) != 0 ))
                      {
                        strm->Des().Format(_L8("%S\r\n"), &(etmp->_Value));
                      FPuts(strm->Des());
                      } else
                      {
                        strm->Des().Format(_L8("%S = %S\r\n"), &(etmp->_Key), &(etmp->_Value));
                      FPuts(strm->Des());
                      }
                   
                  }
                 
                }
                delete strm;
              }

            }



            void CIniFile::CloseIni()
            {
              CFile::DostroyL();
            }





            posted on 2007-08-22 12:29 Khan 閱讀(3647) 評(píng)論(28)  編輯 收藏 引用 所屬分類: GCC/G++跨平臺(tái)開發(fā)

            評(píng)論

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            調(diào)用方式:
            TBuf<128> path;
            path.Format(_L("c:\\cbm\\cbm.ini"));
            CIniFile *ini = CIniFile::NewL(path);
            ini->OpenIni();

            TBuf8<256> sChannels;
            ini->GetValue(_L8("cbm"), _L8("channels"), sChannels);

            TBuf8<4> flag = _L8("1");
            ini->PutValue(sChannel, _L8("flag"), flag);

            ini->CloseIni();
            delete ini;
            2007-08-22 13:00 | Khan's Notebook

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            為什么在最后退出時(shí)會(huì)“嚴(yán)重錯(cuò)誤”?
            2007-09-03 11:04 | Mido

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            我不太清楚你工程中如何調(diào)用
            我在6670 n70手機(jī)中測試沒有出現(xiàn)異常
            2007-09-07 09:53 | Khan's Notebook

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            m_pIniElement好像沒有釋放,請教用destroyL隱藏父類的destroyL是為什么?另外,CIniFile中的的destroyL為什么沒有調(diào)用?
            2007-12-21 17:39 | 新手

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            另外,在調(diào)用的時(shí)候,ini->CloseIni();好像是多于的吧?
            2007-12-21 18:12 | 新手

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            恩.確實(shí)忘記調(diào)用了CIniFile::destroyL, 馬上改過來. 應(yīng)該是在析構(gòu)器中調(diào)用
            2007-12-22 10:27 | Khan.Lau

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            @新手
            ini->CloseIni();主要是為了釋放文件句柄
            2007-12-22 10:30 | Khan's Notebook

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            ini->CloseIni();是釋放文件句柄沒有錯(cuò),但是我看你每一次操作后都有一個(gè)CloaseIni()的,如果還調(diào)用ini->CloseIni();來釋放句柄,是不是就重復(fù)了?
            2007-12-24 18:27 | 新手

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            嗯. 這樣是為了安全. 因?yàn)槲业捻?xiàng)目中需要在一個(gè)或者多個(gè)進(jìn)程中寫ini文件. 也需要讀ini文件. 為了避免文件讀寫沖突, 我習(xí)慣用完馬上關(guān)掉.. 我對文件讀寫沖突是怕了
            2007-12-26 11:08 | Khan's Notebook

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            是啊,但是中間好像有內(nèi)存泄露,IniElement *element = new(ELeave) IniElement;NEW出來了,不刪掉可以嗎?
            2007-12-27 15:12 | 新手

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            void CIniFile::DostroyL()
            {
            for(int i = 0; i<m_pIniElements->Count(); i++)
            delete m_pIniElements->At(i);

            delete m_pIniElements;
            }



            CIniFile::~CIniFile()
            {
            DostroyL();
            }


            析構(gòu)里面不是刪除了么
            2007-12-27 15:16 | Khan's Notebook

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            自己模擬效率太低了,還是通過CDictionaryFileStore搞吧,
            http://coastline.freepgs.com/?p=13
            2008-08-12 00:06 | Coastline

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            TBuf<128> sPath;
            sPath.Format(_L("c:\\account.ini"));
            CIniFile* ifile=CIniFile::NewL(sPath);

            ifile->OpenIni();
            TBuf8<255> sTemp;
            //ifile->GetValue(_L8("account"),_L8("server"),sTemp);
            //CEikEdwin* editor = (CEikEdwin*)(dlg->ControlOrNull(ESERVEREDTId));
            //editor->GetText(iServer);
            CEikEdwin* eds=static_cast< CEikEdwin *>(Control(ESERVEREDTId));
            if (eds)
            eds->GetText(iServer );
            User::InfoPrint(iServer);
            CEikEdwin* edu=static_cast< CEikEdwin *>(Control(EUSEREDTId));
            if (edu)
            edu->GetText(iUser );
            User::InfoPrint(iUser);
            CEikEdwin* edp=static_cast< CEikEdwin *>(Control(EPASSWORDEDTId));
            if (edp)
            edp->GetText(iPassword );
            //User::InfoPrint(iPassword);
            sTemp.Copy(iServer);
            ifile->PutValue(_L8("account"),_L8("server"),sTemp);
            sTemp.Copy(iUser);
            ifile->PutValue(_L8("account"),_L8("user"),sTemp);
            sTemp.Copy(iPassword);
            ifile->PutValue(_L8("account"),_L8("password"),sTemp);
            //static_cast< CAknQueryControl*>(Control())->GetText(iUser );
            //static_cast< CAknQueryControl*>(Control())->GetText(iPassword );


            ifile->CloseIni();
            delete ifile;
            ifile=NULL;
            我這樣調(diào)用有錯(cuò)嗎?我這邊模擬器中會(huì)因?yàn)檫@個(gè)而出錯(cuò)
            2008-09-02 11:11 | 李浩

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            我在項(xiàng)目中某處的調(diào)用代碼 n70 6670真機(jī)執(zhí)行無問題

            void CMobileStockAppUi:: InitChannelData(CArrayFixFlat<STItemStock>* _list_data)
            {
            TBuf8<20> title8;
            TBuf<20> title16;
            TBuf8<128> stocks;

            STItemStock item;

            TBuf<128> path;
            // path.Format(_L("%c:\\MOBILESTOCK\\Stock.ini"), dir);
            path.Format(_L("%c:\\SYSTEM\\APPS\\MOBILESTOCK\\Stock.ini"), dir);
            CIniFile *ini = CIniFile::NewL(path);
            ini->OpenIni();
            ini->GetValue(_L8("Stock"), _L8("stocks"), stocks);
            ini->GetValue(_L8("Stock"), _L8("channel"), title8);
            TLex8 tlex(title8);
            TInt channeltmp;
            tlex.Val(channeltmp);
            iChannel = channeltmp;

            CDesC8Array* pLines = new(ELeave) CDesC8ArrayFlat(20);
            ByteCode::SplitBuf((const TDesC8&)stocks, _L8(","), *pLines );


            for(TInt i = 0; i < pLines->Count(); i++ )
            {
            TPtrC8 stock_sec = (*pLines)[i];

            ini->GetValue(stock_sec, _L8("flag"), title8);
            TInt ib = 0;

            tlex.Assign(title8);
            tlex.Val(ib);
            if( ib == 1 ) //先判斷flag是否有效
            {
            TBuf8<20> stock_name =_L8("");;
            ini->GetValue(stock_sec, _L8("name"), stock_name);
            title8.Format(_L8("%S"), &stock_name );
            ByteCode::ConvGbk2Uni(title8, title16) ;
            item._name = title16;

            tlex.Assign(stock_sec);
            tlex.Val(ib);
            item._id = ib;

            ini->GetValue(stock_sec, _L8("postion"), title8);
            CDesC8Array* pposes = new(ELeave) CDesC8ArrayFlat(20);
            ByteCode::SplitBuf(title8, _L8("/"), *pposes );
            if(pposes->Count() == 3)
            {
            tlex.Assign((*pposes)[0]);
            tlex.Val(ib);
            item._pos = ib;

            tlex.Assign((*pposes)[1]);
            tlex.Val(ib);
            item._pos_page = ib;

            tlex.Assign((*pposes)[2]);
            tlex.Val(ib);
            item._pos_offset = ib;
            }

            delete pposes;

            ini->GetValue(stock_sec, _L8("begin_price"), title8);
            tlex.Assign(title8);
            tlex.Val(ib);
            item._begin_price = ib;

            item._curr_price = 0;

            _list_data->AppendL(item);
            }
            }

            delete pLines;


            ini->CloseIni();
            delete ini;
            }
            2008-09-02 11:50 | Khan's Notebook

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            不是GetValue有問題,是PutValue有問題,我的代碼中監(jiān)測下來
            2008-09-02 13:00 | 李浩

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            put部分代碼

            void CCbmReciver::RunL()
            {
            TInt reqCode = this->iStatus.Int();

            if (reqCode == KErrNone)
            {
            TPageMsg page;

            CMobileStockAppUi *ui = (CMobileStockAppUi*)(CEikonEnv::Static()->AppUi());
            //00 01 序列號(hào)
            //02 03 頻道號(hào)
            //04 Data Coding Scheme
            //05 Page parameter
            //06-87 廣播體


            page._channel=(mBuf[2]<<8) + mBuf[3];

            //channel = page._channel;

            if(page._channel == ui->iChannel)//如果屬于頻道列表之內(nèi)
            {

            //DebugPrint(mBuf);//debug

            page._serial =(mBuf[0]<<8) + mBuf[1]; //cbm序列號(hào)
            page._cur_page=(mBuf[5] >> 4) & 0x0F; //頁碼
            page._total_page=(mBuf[5]) & 0x0F; //總頁數(shù)

            if(mBuf[6]==0x7A && mBuf[7]==0x34)
            mBuf.Delete(0,8); //廣州需要去掉頭8個(gè)字節(jié)
            else
            mBuf.Delete(0,6); //深圳去掉6字節(jié)

            TBuf8<40> base64tmp;
            for(TInt j = 0; j<mBuf.Length(); j++)
            {
            if(mBuf[j]>0)
            base64tmp.Append(mBuf[j]);
            }

            base64tmp.Delete(0,2);//去掉2字節(jié)多余的填充,
            TUint8 asms = base64tmp[0] &0x0f; //第幾條廣播
            TUint8 aflag = base64tmp[1] &0x0f;
            base64tmp.Delete(0,2);//去掉數(shù)據(jù)包頭,

            for (TInt i = 0; i<ui->_list_data->Count(); i++)
            {
            if((*(ui->_list_data))[i]._pos_page == page._cur_page - 1)//如果包含需要的頁
            {
            if((*(ui->_list_data))[i]._pos == asms) //如果包含當(dāng)前的消息
            {

            HBufC8 * buffer = HBufC8::NewLC(mBuf.Length());
            TImCodecB64 b64;
            TPtr8 buffPtr = buffer->Des();
            b64.Initialise();
            b64.Decode(base64tmp, buffPtr);

            if (aflag == 1)//開盤價(jià)
            {
            //存配置文件
            TBuf8<10> aid;
            aid.Format(_L8("%06d"), (*(ui->_list_data))[i]._id);

            TBuf8<10> abegin_price;
            TInt aoffset= 1 + (*(ui->_list_data))[i]._pos_offset * 2;
            abegin_price.Format(_L8("%d"), (buffPtr[aoffset]<<8) + buffPtr[aoffset+1]);
            TBuf<128> path;
            path.Format(_L("%c:\\SYSTEM\\APPS\\MOBILESTOCK\\Stock.ini"), ui->dir);
            CIniFile *ini = CIniFile::NewL(path);
            ini->OpenIni();
            ini->PutValue(aid, _L8("begin_price"), abegin_price);
            ini->CloseIni();
            delete ini;
            }
            else //當(dāng)前價(jià)
            {
            //顯示在屏幕
            TInt aoffset= 1 + (*(ui->_list_data))[i]._pos_offset * 2;

            (*(ui->_list_data))[i]._curr_price = (buffPtr[aoffset]<<8) + buffPtr[aoffset+1];//取得當(dāng)前價(jià)
            HBufC* buf = HBufC::NewLC(80);
            buf->Des().Format(_L("offset=%d index=%d price=%d"), aoffset, i, (*(ui->_list_data))[i]._curr_price);
            CAknInformationNote* note = new (ELeave) CAknInformationNote;
            note->ExecuteLD(*buf);
            CleanupStack::PopAndDestroy(buf);
            /*
            TBuf<32> filename;
            filename.Format(_L("c:\\ddc%d-%d.txt"), aoffset, i);
            CFile::LogToFile(filename, base64tmp);*/
            ui->DrawStockAppview();//重繪界面
            }


            CleanupStack::PopAndDestroy(buffer);
            }
            }
            }
            }

            StartL();
            }
            }
            2008-09-02 14:20 | Khan's Notebook

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            要郁悶死了,我只是
            打開文件
            ifile->PutValue(_L8("account"),_L8("server"),_L8("lihao"));
            關(guān)閉,這樣可以操作,但是退出程序時(shí)提示有內(nèi)存泄露,卻找不著
            2008-09-02 15:26 | 李浩

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            你比對一下回車符之類的文本格式看看, unix和dos方式都試試
            2008-09-02 16:04 | Khan's Notebook

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            對比了,它是能讀,沒有問題,只有寫的時(shí)候,寫進(jìn)去了,只是在程序退出時(shí)才會(huì)報(bào)alloc錯(cuò)誤
            2008-09-02 16:54 | 李浩

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            留email:我給你一份最新的版本, 或許我后來改了什么東西, 最終項(xiàng)目測試是在07年12月的時(shí)候, 可能跟這里的版本有一些變化
            2008-09-02 17:36 | Khan's Notebook

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            lihao_nx@yahoo.com.cn
            2008-09-02 17:39 | 李浩

            # 類是有個(gè)bug  回復(fù)  更多評(píng)論   

            TInt CIniFile::PutValue(const TDesC8 &p_Section, const TDesC8 &p_Key, const TDesC8 &p_Value )
            {
            IniElement *element = new(ELeave) IniElement;
            .....
            }
            在整個(gè)函數(shù)中,element 沒有釋放,我在我的模擬器釋放了就可以了
            2008-09-04 09:33 | 李浩

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            釋放是在這里的.
            void CIniFile::DostroyL()
            {
            for(int i = 0; i<m_pIniElements->Count(); i++)
            delete m_pIniElements->At(i);

            delete m_pIniElements;
            }
            m_pIniElements只是存放指針, 你如果早早的把指針指向的內(nèi)存塊都釋放了. 這個(gè)東西就變成一堆垃圾數(shù)據(jù)了..., 你說你那邊正常我就有點(diǎn)不懂了...
            2008-09-04 10:19 | Khan's Notebook

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            我也搞不懂了,呵呵,因?yàn)樗赑utValue中是將指針壓入到m_pIniElements.并不能釋放,但是在我的模擬器上卻是只有這樣才能正常,非常搞不懂
            2008-09-04 14:03 | 李浩

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            不確定你寫ini之后最終是否執(zhí)行了. iniclose那個(gè)釋放的操作...
            2008-09-04 15:02 | Khan's Notebook

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            是執(zhí)行了,我是按你的調(diào)用方法調(diào)用的
            2008-09-05 09:25 | 李浩

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            以上的問題出現(xiàn)在PutValue函數(shù)里面, 假如element指針沒有壓入到m_pIniElements里面,那么就最后析構(gòu)的時(shí)候不能釋放, 因此造成內(nèi)存泄露.
            2009-03-31 17:47 | scribbler

            # re: symbian 的ini文件類.  回復(fù)  更多評(píng)論   

            CIniFile::~CIniFile()
            {
            DostroyL();
            }
            這少一句,而且好象這個(gè)ini只能結(jié)操作gbk的
            2011-02-25 03:04 | zorro0799
            国产精品久久永久免费| 久久婷婷五月综合97色直播| 国产一区二区精品久久 | 久久综合亚洲欧美成人| 欧美激情精品久久久久久| 久久精品人妻中文系列| 国产69精品久久久久观看软件| 国内精品久久久久影院网站| 99久久精品国内| 人人狠狠综合久久亚洲| 亚洲精品午夜国产va久久| 亚洲国产精品综合久久一线| 久久亚洲国产精品五月天婷| 人妻无码中文久久久久专区| 久久精品国产一区二区三区不卡| 久久精品国产亚洲AV不卡| 性高湖久久久久久久久| 久久精品亚洲一区二区三区浴池 | 精品久久人妻av中文字幕| 亚洲第一极品精品无码久久 | 国内精品久久久久久久久电影网| 久久亚洲sm情趣捆绑调教 | 久久最新精品国产| 精品久久久久中文字| 人妻无码久久一区二区三区免费| 久久久人妻精品无码一区| 国产精品一区二区久久精品| 亚洲va国产va天堂va久久| 久久国产亚洲精品| 久久久久国色AV免费观看| 岛国搬运www久久| 久久久久亚洲精品日久生情| 久久国产影院| 精品久久人人爽天天玩人人妻| 97精品国产91久久久久久| 99精品国产在热久久无毒不卡| 性高湖久久久久久久久| 日韩精品久久久久久久电影蜜臀 | 亚洲午夜久久久久妓女影院| 中文字幕精品久久久久人妻| 四虎国产精品免费久久|