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

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

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

             

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

            例如雙字的插入(寫(xiě))

            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(如派生類(lèi)CMemFile)對(duì)象提供的,但一般是CArchive自己建立的。

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

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

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

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

             

             

            這里粘貼一個(gè)日志文件的類(lèi)文件中使用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;                 //作為文件讀寫(xiě)到內(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ù)寫(xiě)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修改為類(lèi)變量吧,然后找個(gè)獲取當(dāng)前目錄的函數(shù),改動(dòng)下吧,白給你用這個(gè)類(lèi)不看看也是不行的"

                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   博問(wèn)   Chat2DB   管理


            精品久久久久久久久中文字幕| 狠狠综合久久AV一区二区三区| 久久国产亚洲精品无码| 一本一本久久A久久综合精品 | 伊人久久大香线蕉av不变影院| 四虎国产精品成人免费久久| 青青青青久久精品国产 | 97久久超碰国产精品2021| 日本人妻丰满熟妇久久久久久| 99麻豆久久久国产精品免费| 精品久久久久中文字| 一本久道久久综合狠狠爱| 国产香蕉97碰碰久久人人| 99久久精品国产麻豆| 乱亲女H秽乱长久久久| 久久性生大片免费观看性| 国产人久久人人人人爽| 久久人人爽人人人人爽AV | 亚洲AV无码久久精品狠狠爱浪潮| 亚洲精品乱码久久久久久久久久久久 | 97精品依人久久久大香线蕉97 | 欧美精品一本久久男人的天堂| 久久96国产精品久久久| 国内精品久久国产大陆| 久久亚洲欧美国产精品| 亚洲AV无码1区2区久久| 亚洲欧美日韩久久精品第一区| 国产精品久久新婚兰兰| 午夜视频久久久久一区 | 久久亚洲精品国产精品| 国产精品久久久香蕉| 久久精品亚洲中文字幕无码麻豆| 久久毛片一区二区| 伊人久久大香线蕉av一区| 内射无码专区久久亚洲| 国内精品人妻无码久久久影院| 久久天天躁狠狠躁夜夜躁2014| 久久99热这里只频精品6| 久久国产精品99国产精| 久久国产精品二国产精品| 久久人妻无码中文字幕|