• <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
            數據加載中……

            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()) );       //讀出所有文件內容
              bufc->Des().Append(_L8("\r\n"));
             
              TPtrC8 iCursor(bufc->Des()); //指向文件內容的指針
             
              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); //取出一行內容
               
                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   //注釋,,空行等無用數據
                {
                  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();  //關閉文件句柄
              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);
              }
            //輸出調試
              /*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);
              }
              */

             
              //將內存中的ini覆寫回文件
              ConstructL(EFileRead | EFileWrite);
              TInt pos;
              FSeek(ESeekStart,pos);
              FSetSize(0);
             
              WriteIni();
             
              CloseIni();  //關閉文件句柄
              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) //如果查到當前塊的子項
                  {
                    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) 評論(28)  編輯 收藏 引用 所屬分類: GCC/G++ 、跨平臺開發(fā)

            評論

            # re: symbian 的ini文件類.  回復  更多評論   

            調用方式:
            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文件類.  回復  更多評論   

            為什么在最后退出時會“嚴重錯誤”?
            2007-09-03 11:04 | Mido

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

            恩.確實忘記調用了CIniFile::destroyL, 馬上改過來. 應該是在析構器中調用
            2007-12-22 10:27 | Khan.Lau

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

            嗯. 這樣是為了安全. 因為我的項目中需要在一個或者多個進程中寫ini文件. 也需要讀ini文件. 為了避免文件讀寫沖突, 我習慣用完馬上關掉.. 我對文件讀寫沖突是怕了
            2007-12-26 11:08 | Khan's Notebook

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

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

            delete m_pIniElements;
            }



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


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

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

            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;
            我這樣調用有錯嗎?我這邊模擬器中會因為這個而出錯
            2008-09-02 11:11 | 李浩

            # re: symbian 的ini文件類.  回復  更多評論   

            我在項目中某處的調用代碼 n70 6670真機執(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文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

            put部分代碼

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

            if (reqCode == KErrNone)
            {
            TPageMsg page;

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


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

            //channel = page._channel;

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

            //DebugPrint(mBuf);//debug

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

            if(mBuf[6]==0x7A && mBuf[7]==0x34)
            mBuf.Delete(0,8); //廣州需要去掉頭8個字節(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);//去掉數據包頭,

            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) //如果包含當前的消息
            {

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

            if (aflag == 1)//開盤價
            {
            //存配置文件
            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 //當前價
            {
            //顯示在屏幕
            TInt aoffset= 1 + (*(ui->_list_data))[i]._pos_offset * 2;

            (*(ui->_list_data))[i]._curr_price = (buffPtr[aoffset]<<8) + buffPtr[aoffset+1];//取得當前價
            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文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

            對比了,它是能讀,沒有問題,只有寫的時候,寫進去了,只是在程序退出時才會報alloc錯誤
            2008-09-02 16:54 | 李浩

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # 類是有個bug  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

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

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

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

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

            # re: symbian 的ini文件類.  回復  更多評論   

            CIniFile::~CIniFile()
            {
            DostroyL();
            }
            這少一句,而且好象這個ini只能結操作gbk的
            2011-02-25 03:04 | zorro0799
            99久久免费国产精品| 欧美黑人又粗又大久久久| 狠狠色丁香久久婷婷综合| 欧美精品丝袜久久久中文字幕| 久久婷婷五月综合色高清| 性色欲网站人妻丰满中文久久不卡| 久久综合九色欧美综合狠狠| 久久免费视频6| 伊人久久精品影院| 亚洲精品国产美女久久久| 伊人久久无码中文字幕| 国内精品久久久久久久97牛牛| 久久久久女人精品毛片| 国产亚洲精品美女久久久| 国产亚洲欧美成人久久片| 美女写真久久影院| 亚洲国产精品久久久久网站| 国产成人综合久久久久久| 久久最新免费视频| 日韩精品久久久久久久电影蜜臀| 色欲久久久天天天综合网精品| 久久超乳爆乳中文字幕| 99久久国产综合精品成人影院| 久久久久18| 久久久久久久亚洲Av无码| 91精品国产色综久久| 性做久久久久久久久浪潮| 久久无码人妻一区二区三区| 99久久99久久精品国产片果冻| 亚洲精品无码久久久久AV麻豆| 色综合久久无码五十路人妻| 青青青青久久精品国产| 伊人色综合久久天天网| 久久精品夜夜夜夜夜久久| 国产一区二区精品久久岳| 狠狠色狠狠色综合久久| 久久精品国产亚洲Aⅴ香蕉| 7777精品久久久大香线蕉 | 国产高清美女一级a毛片久久w| 亚洲国产精品综合久久网络| 69SEX久久精品国产麻豆|