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

            kenlistian

            厚積薄發(fā). 勤為槳,思為帆

               :: 首頁(yè) :: 新隨筆 ::  :: 聚合  :: 管理 ::
              73 隨筆 :: 4 文章 :: 22 評(píng)論 :: 0 Trackbacks

            部分載自:http://www.tongyi.net/develop/mfc/1003840.html

            CArchive類是使用了緩沖區(qū),即一段內(nèi)存空間作為臨時(shí)數(shù)據(jù)存儲(chǔ)地,對(duì)CArchive的讀寫都先依次排列到此緩沖區(qū),當(dāng)緩沖區(qū)滿或用戶要求時(shí),將此段整理后的數(shù)據(jù)讀寫到指定的存儲(chǔ)煤質(zhì)。

            一般來(lái)說,CArchive封裝了對(duì)該緩沖區(qū)的操作,它的好處是可以少劃動(dòng)硬盤以及提高運(yùn)行速度。不過對(duì)于使用MFC來(lái)說,是一個(gè)很好的封裝??纯雌鋵?duì)讀寫的操作,可見在實(shí)際編程上是非常容易出錯(cuò)的。對(duì)于這樣的類,一定要封裝好,作為一個(gè)公用函數(shù)或公用類調(diào)用,否則在實(shí)際中像c那樣散在代碼的各個(gè)地方的話,恐怕有時(shí)頭會(huì)大。

            有時(shí)我想,如果編程在這些地方磨洋工的話,恐怕一個(gè)大的工程軟件寫起來(lái)得好長(zhǎng)時(shí)間。所以說盡量已組件的方式,類的思路來(lái)組合前人的算法,技巧也是一種編程的進(jìn)步。

             

            所下列看其對(duì)指針的嫻熟操作(也是往往出錯(cuò)的啊),

            例如雙字的插入(寫)

            CArchive& CArchive::operator<<(DWORD dw)
            {
               if (m_lpBufCur + sizeof(DWORD) > m_lpBufMax) //緩沖區(qū)空間不夠
                   Flush();                                  //緩沖區(qū)內(nèi)容提交到實(shí)際存儲(chǔ)煤質(zhì)。
               if (!(m_nMode & bNoByteSwap))
                 _AfxByteSwap(dw, m_lpBufCur);  //處理字節(jié)順序
               else
                 *(DWORD*)m_lpBufCur = dw;      //添入緩沖區(qū)
               m_lpBufCur += sizeof(DWORD);     //移動(dòng)當(dāng)前指針
               return *this;
            }
            

            雙字的提取(讀)

            CArchive& CArchive::operator>>(DWORD& dw)
            {
              if (m_lpBufCur + sizeof(DWORD) > m_lpBufMax) //緩沖區(qū)要讀完了
                  FillBuffer(sizeof(DWORD) - (UINT)(m_lpBufMax - m_lpBufCur));  //重新讀入內(nèi)容到緩沖區(qū)
               dw = *(DWORD*)m_lpBufCur;  //讀取雙字
               m_lpBufCur += sizeof(DWORD); //移動(dòng)當(dāng)前位置指針
               if (!(m_nMode & bNoByteSwap))
                 _AfxByteSwap(dw, (BYTE*)&dw);  //處理字節(jié)順序
               return *this;
            }
            

             

            內(nèi)部指針

            緩沖區(qū)指針 BYTE* m_lpBufStart,指向緩沖區(qū),這個(gè)緩沖區(qū)有可能是底層CFile(如派生類CMemFile)對(duì)象提供的,但一般是CArchive自己建立的。

            緩沖區(qū)尾部指針 BYTE* m_lpBufMax;

            緩沖區(qū)當(dāng)前位置指針 BYTE* m_lpBufCur;

            初始化時(shí),讀模式,當(dāng)前位置在尾部,是寫模式,當(dāng)前位置在頭部:

            m_lpBufCur = (IsLoading()) ? m_lpBufMax : m_lpBufStart;

             

             

            這里粘貼一個(gè)日志文件的類文件中使用CArchive作為內(nèi)部操作的例子吧。利用CArchive去Flush,Write,Open,這里先把CArchive的參量列出:

             

            CArchive(CFile* pFile, UINT nMode, int nBufSize = 4096, void* lpBuf = NULL);

             

            class CLogFile
            {
            protected:
                int     m_nCachBuffSize;
                int     m_nCurentBuffSize;
                char *  m_lpCachBuff;
                CString m_fileName;            

                CArchive  *m_pArchive;                 //作為文件讀寫到內(nèi)存的實(shí)際操作。
                CFile     m_file;

                CRITICAL_SECTION m_csFile;
                SYSTEMTIME  m_tmCurTime;         //當(dāng)前時(shí)間
                SYSTEMTIME    m_tmLastTime;      //上次日志時(shí)間
            public:
                void Open(char *fileName);
                void Close();

                void Wirte(char * buff ,int size=0);             
                void WriteLog(char *szLog, int size =0);
                void Flush();

                CLogFile() ;
                ~CLogFile() ;
            };

             

             

            ***************************************************

            #include "stdafx.h"
            #include "LogFile.h"
            #include "pubfunc.h"

            CLogFile :: CLogFile()
            {
                ::InitializeCriticalSection(&m_csFile);
                m_pArchive = NULL;
                m_fileName = "";
                m_lpCachBuff = new char[MAX_LOG_BUFF + 1 ];             //作為內(nèi)存緩沖區(qū)
                m_nCachBuffSize = MAX_LOG_BUFF ;
                m_nCurentBuffSize = 0;
            }

            CLogFile :: ~CLogFile()
            {
                if(m_pArchive)
                {
                    m_pArchive->Flush();
                    m_file.Close();
                    delete m_pArchive;
                    m_pArchive= NULL;
                }
                if(m_lpCachBuff)
                {
                    delete []m_lpCachBuff;
                }
                ::DeleteCriticalSection(&m_csFile);
            }

            void CLogFile::WriteLog(char *szLog, int size)
            {
                if (size == 0)
                    size = strlen(szLog);
                Wirte(szLog , size);
            }


            void CLogFile::Flush()
            {
                EnterCriticalSection(&m_csFile);
                if(m_pArchive)
                {
                    m_pArchive->Flush();
                    m_nCurentBuffSize=0;
                }
                LeaveCriticalSection(&m_csFile);
            }


            void CLogFile::Wirte(char * buff ,int size)
            {
                EnterCriticalSection(&m_csFile);
                GetLocalTime(&m_tmCurTime);
                char szTime[128]={0};
                int  timelen = sprintf(szTime,"\r\n%04d-%02d-%02d %02d:%02d:%02d\r\n\r\n",m_tmCurTime.wYear,m_tmCurTime.wMonth,m_tmCurTime.wDay,m_tmCurTime.wHour,m_tmCurTime.wMinute,m_tmCurTime.wSecond);
                if (m_tmCurTime.wYear != m_tmLastTime.wYear
                    ||m_tmCurTime.wMonth != m_tmLastTime.wMonth
                    ||m_tmCurTime.wDay != m_tmLastTime.wDay)
                {
                    if(m_pArchive)
                    {
                        m_pArchive->Flush();
                        m_file.Close();
                    }

                    char szFile[256],szPath[256];
                    GetLocalTime(&m_tmLastTime);
                    //GetAppPath(szPath);

                    szPath = "自己抓取當(dāng)前目錄吧,出錯(cuò)我不管了";
                    if(m_pArchive)
                    {
                        delete m_pArchive;
                    }
                    if(m_fileName.IsEmpty())
                    {
                        sprintf(szFile,"%s\\Log\\%d-%02d-%02d_%s.log",szPath,m_tmLastTime.wYear,m_tmLastTime.wMonth,m_tmLastTime.wDay,(LPTSTR)(LPCTSTR)m_fileName);
                    }else
                    {
                        sprintf(szFile,"%s\\Log\\%d-%02d-%02d.log",szPath,m_tmLastTime.wYear,m_tmLastTime.wMonth,m_tmLastTime.wDay);
                    }

                    if(m_file.Open(szFile,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::shareDenyNone,0))
                    {
                        m_file.SeekToEnd();
                        m_pArchive = new CArchive(&m_file,CArchive::store,m_nCachBuffSize,m_lpCachBuff);
                        int totalsize = timelen + size ;
                        if( totalsize > ( m_nCachBuffSize - m_nCurentBuffSize)  )
                        {  
                            m_pArchive->Flush();
                            m_pArchive->Write( szTime ,timelen );
                            m_pArchive->Flush();
                            for ( int i =0 ; i < totalsize/m_nCachBuffSize;i++)
                            {
                                m_pArchive->Write(buff+m_nCachBuffSize * i ,m_nCachBuffSize);
                                m_pArchive->Flush();
                            }
                            m_nCurentBuffSize = totalsize - m_nCachBuffSize * (totalsize/m_nCachBuffSize);
                            m_pArchive->Write(buff+m_nCachBuffSize * (totalsize/m_nCachBuffSize) * i ,m_nCurentBuffSize);
                            m_lpCachBuff[m_nCurentBuffSize+1] = 0;
                        }
                        else
                        {
                            m_pArchive->Write( szTime ,timelen );
                            m_pArchive->Write( buff   ,size );
                            m_nCurentBuffSize=m_nCurentBuffSize+ totalsize;
                            m_lpCachBuff[m_nCurentBuffSize+1]=0;
                        }
                    }
                    else
                    {
                        m_pArchive = NULL;
                    }   
                }   
                else
                {//續(xù)寫log文件
                    if(m_pArchive)
                    {
                        int totalsize = timelen + size ;
                        if( totalsize > ( m_nCachBuffSize -m_nCurentBuffSize) )
                        {  
                            m_pArchive->Flush();
                            m_pArchive->Write( szTime ,timelen );
                            m_pArchive->Flush();
                            for ( int i =0 ; i < totalsize/m_nCachBuffSize;i++)
                            {
                                m_pArchive->Write(buff+m_nCachBuffSize * i ,m_nCachBuffSize);
                                m_pArchive->Flush();
                            }
                            m_nCurentBuffSize = totalsize - m_nCachBuffSize * (totalsize/m_nCachBuffSize);
                            m_pArchive->Write(buff+m_nCachBuffSize * (totalsize/m_nCachBuffSize) * i ,m_nCurentBuffSize);
                            m_lpCachBuff[m_nCurentBuffSize + 1]=0;
                        }
                        else
                        {
                            m_pArchive->Write( szTime ,timelen );
                            m_pArchive->Write( buff, size );
                            m_nCurentBuffSize = m_nCurentBuffSize + totalsize;
                            m_lpCachBuff[m_nCurentBuffSize+1]=0;
                        }       
                    }
                }

                   LeaveCriticalSection(&m_csFile);
            }

            /*
              fileName    文件名稱  
            */
            void CLogFile::Open( char *fileName)
            {
                m_nCurentBuffSize = 0;
                ::InitializeCriticalSection(&m_csFile);
                char szFile[256],szPath[256];
                GetLocalTime(&m_tmLastTime);

                // GetAppPath(szPath);

               szPath = "把szPath修改為類變量吧,然后找個(gè)獲取當(dāng)前目錄的函數(shù),改動(dòng)下吧,白給你用這個(gè)類不看看也是不行的"

                if(fileName == 0 || fileName[0] == 0)
                {
                    sprintf(szFile,"%s\\Log\\%d-%02d-%02d.log",szPath,m_tmLastTime.wYear,m_tmLastTime.wMonth,m_tmLastTime.wDay);
                }
                else
                {
                    m_fileName = fileName;
                    sprintf(szFile,"%s\\Log\\%d-%02d-%02d_%s.log",szPath,m_tmLastTime.wYear,m_tmLastTime.wMonth,m_tmLastTime.wDay,fileName);
                }
                if(m_file.Open(szFile,CFile::modeCreate | CFile::modeNoTruncate | CFile::modeReadWrite|CFile::shareDenyNone,0))
                {
                    m_pArchive = new CArchive(&m_file,CArchive::store,m_nCachBuffSize, m_lpCachBuff);
                }
                else
                {
                    m_pArchive = NULL;
                }
            }

            void CLogFile::Close()
            {
                if(m_pArchive)
                {
                    m_pArchive->Flush();
                    m_file.Close();
                    delete m_pArchive;
                    m_pArchive= NULL;
                }
                m_nCurentBuffSize = 0;
            }

            posted on 2008-01-05 17:27 kenlistian 閱讀(6527) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产成人精品久久| 色综合久久中文字幕综合网 | 亚洲中文字幕无码久久综合网| 久久亚洲AV成人无码软件| 久久久久人妻一区精品性色av| 亚洲国产精久久久久久久| 久久亚洲AV无码精品色午夜麻豆| 99久久99久久精品免费看蜜桃| 久久se这里只有精品| 亚洲中文字幕无码久久综合网| 久久精品国产亚洲7777| 色综合久久中文字幕无码| 日日狠狠久久偷偷色综合0| 久久不见久久见免费视频7| 中文字幕久久精品| 国产成人久久久精品二区三区 | 久久香蕉国产线看观看99| 久久91精品国产91| 国産精品久久久久久久| A狠狠久久蜜臀婷色中文网| 国产精品美女久久福利网站| 久久亚洲高清观看| 国产精品禁18久久久夂久| 久久人妻少妇嫩草AV蜜桃| 亚洲性久久久影院| 久久综合九色综合久99| 狠狠色丁香婷婷综合久久来来去| 久久91精品国产91久久户| 欧美大香线蕉线伊人久久| 日日噜噜夜夜狠狠久久丁香五月| 狠狠色丁香久久婷婷综合图片| 久久综合伊人77777麻豆| 久久se精品一区二区影院| 国产成人久久精品二区三区| 9191精品国产免费久久| 91精品国产色综久久| yellow中文字幕久久网| 久久精品国产亚洲7777| 欧美与黑人午夜性猛交久久久 | 久久亚洲精品国产精品| 国产一区二区三区久久精品|