青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

kenlistian

厚積薄發. 勤為槳,思為帆

   :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理 ::
  73 隨筆 :: 4 文章 :: 22 評論 :: 0 Trackbacks

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

CArchive類是使用了緩沖區,即一段內存空間作為臨時數據存儲地,對CArchive的讀寫都先依次排列到此緩沖區,當緩沖區滿或用戶要求時,將此段整理后的數據讀寫到指定的存儲煤質。

一般來說,CArchive封裝了對該緩沖區的操作,它的好處是可以少劃動硬盤以及提高運行速度。不過對于使用MFC來說,是一個很好的封裝。看看其對讀寫的操作,可見在實際編程上是非常容易出錯的。對于這樣的類,一定要封裝好,作為一個公用函數或公用類調用,否則在實際中像c那樣散在代碼的各個地方的話,恐怕有時頭會大。

有時我想,如果編程在這些地方磨洋工的話,恐怕一個大的工程軟件寫起來得好長時間。所以說盡量已組件的方式,類的思路來組合前人的算法,技巧也是一種編程的進步。

 

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

例如雙字的插入(寫)

CArchive& CArchive::operator<<(DWORD dw)
{
   if (m_lpBufCur + sizeof(DWORD) > m_lpBufMax) //緩沖區空間不夠
       Flush();                                  //緩沖區內容提交到實際存儲煤質。
   if (!(m_nMode & bNoByteSwap))
     _AfxByteSwap(dw, m_lpBufCur);  //處理字節順序
   else
     *(DWORD*)m_lpBufCur = dw;      //添入緩沖區
   m_lpBufCur += sizeof(DWORD);     //移動當前指針
   return *this;
}

雙字的提取(讀)

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

 

內部指針

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

緩沖區尾部指針 BYTE* m_lpBufMax;

緩沖區當前位置指針 BYTE* m_lpBufCur;

初始化時,讀模式,當前位置在尾部,是寫模式,當前位置在頭部:

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

 

 

這里粘貼一個日志文件的類文件中使用CArchive作為內部操作的例子吧。利用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;                 //作為文件讀寫到內存的實際操作。
    CFile     m_file;

    CRITICAL_SECTION m_csFile;
    SYSTEMTIME  m_tmCurTime;         //當前時間
    SYSTEMTIME    m_tmLastTime;      //上次日志時間
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 ];             //作為內存緩沖區
    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 = "自己抓取當前目錄吧,出錯我不管了";
        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
    {//續寫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修改為類變量吧,然后找個獲取當前目錄的函數,改動下吧,白給你用這個類不看看也是不行的"

    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 閱讀(6534) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            一本久道久久久| 国产精品久久77777| 日韩视频免费观看高清在线视频| 麻豆成人精品| 免费一区视频| 91久久久亚洲精品| 亚洲国产精品精华液2区45| 欧美刺激性大交免费视频| 欧美成人69| 亚洲高清免费| 亚洲免费成人| 午夜精品久久久久久99热| 久久国产精品久久久久久电车| 欧美影院视频| 欧美成人精品在线播放| 欧美日韩视频在线第一区| 欧美视频在线观看视频极品| 久久精品国产清高在天天线| 国产一级久久| 欧美日韩一区二区三区在线观看免| 欧美日韩亚洲不卡| 国产精品免费看片| 精品99视频| 一区二区成人精品| 久久成人精品无人区| 欧美激情aⅴ一区二区三区| 在线中文字幕日韩| 久久久午夜视频| 国产精品成人免费精品自在线观看| 国产一区二区高清| 夜夜嗨av一区二区三区四区| 久久精品国产99| 亚洲人成啪啪网站| 午夜亚洲福利| 欧美日韩国产一区| 好男人免费精品视频| 中文亚洲欧美| 美国成人毛片| 亚洲一区二区三区视频| 老司机久久99久久精品播放免费| 欧美色大人视频| 在线日韩欧美| 久久国产精品色婷婷| 亚洲人成绝费网站色www| 午夜精品亚洲一区二区三区嫩草| 欧美福利视频网站| 黄色日韩精品| 欧美一区=区| 99国产精品私拍| 久久视频国产精品免费视频在线| 欧美日韩另类在线| 亚洲久久成人| 欧美激情久久久久久| 欧美制服丝袜第一页| 国产精品啊啊啊| 日韩视频精品在线观看| 欧美大片va欧美在线播放| 性亚洲最疯狂xxxx高清| 国产精品黄视频| 亚洲视频在线观看三级| 亚洲日本欧美| 欧美激情四色| 亚洲美女精品成人在线视频| 欧美大片免费观看| 久久人人爽国产| 加勒比av一区二区| 久久综合999| 欧美在线播放| 国内一区二区三区| 狼人天天伊人久久| 久久精品免费播放| 一区二区视频在线观看| 久久女同互慰一区二区三区| 午夜欧美不卡精品aaaaa| 国产精品亚洲一区二区三区在线| 亚洲一区二区三区在线播放| 国产日韩欧美三区| 国产精品videosex极品| 中日韩午夜理伦电影免费| 最新国产成人av网站网址麻豆 | 欧美一区二区三区四区在线观看| 欧美午夜a级限制福利片| 亚洲女女女同性video| 9色精品在线| 国产欧美视频一区二区| 久久综合色8888| 欧美激情一区二区三区在线| 亚洲一区视频在线| 午夜欧美精品久久久久久久| 精品动漫3d一区二区三区免费| 麻豆精品视频在线观看| 欧美精品福利| 午夜精品久久久久久久蜜桃app | 欧美日韩精品一区二区三区| 午夜精品久久久久久| 久久av一区二区三区| 亚洲激情在线观看视频免费| 99re8这里有精品热视频免费| 国产精品综合不卡av| 欧美激情麻豆| 国产欧美一区二区精品性色| 亚洲国产mv| 国产丝袜一区二区三区| 亚洲欧洲一区| 国色天香一区二区| aa亚洲婷婷| 亚洲国产精品精华液2区45 | 亚欧成人精品| 最新国产の精品合集bt伙计| 中文一区二区| 亚洲精品少妇30p| 亚洲欧美亚洲| 9久草视频在线视频精品| 欧美中文在线视频| 亚洲免费在线视频一区 二区| 久久免费黄色| 久久精品亚洲| 国产精品久久久久久久午夜 | 亚洲宅男天堂在线观看无病毒| 午夜视频一区二区| 亚洲一区二区三区欧美| 麻豆精品在线视频| 欧美中文字幕视频| 欧美午夜女人视频在线| 欧美高清你懂得| 一区二区在线免费观看| 午夜综合激情| 亚洲欧美国产制服动漫| 国产精品久久久久一区| 亚洲欧美精品suv| 一区二区三欧美| 亚洲男人的天堂在线观看| 亚洲欧美中文在线视频| 亚洲影音先锋| 免费亚洲婷婷| 久久久7777| 99亚洲一区二区| 亚洲网站啪啪| 欧美成人网在线| 女人色偷偷aa久久天堂| 国产欧美丝祙| 亚洲视频网在线直播| 欧美激情第8页| 老司机久久99久久精品播放免费| 国产精品综合av一区二区国产馆| 亚洲日韩欧美视频一区| 久久久久久久久久久成人| 99这里只有久久精品视频| 免费成人毛片| 亚洲国产精品一区二区第四页av | 亚洲黄色在线观看| 猫咪成人在线观看| 久久免费偷拍视频| 国产欧美日韩精品丝袜高跟鞋| 亚洲伦理中文字幕| 亚洲欧洲日韩综合二区| 欧美精品情趣视频| 亚洲你懂的在线视频| 亚洲欧美久久久| 亚洲精品乱码久久久久| 亚洲天堂免费在线观看视频| 亚洲欧美清纯在线制服| 亚洲国产精品一区二区www在线| 亚洲丶国产丶欧美一区二区三区| 国产欧美日韩综合| 亚洲国产一区视频| 亚洲高清色综合| 亚洲视频精品在线| 亚洲图片在线| 国产日韩欧美中文| 91久久精品一区二区别| 黄色亚洲免费| 亚洲视频999| 久久色中文字幕| 久久精品国产亚洲精品| 欧美午夜在线一二页| 亚洲精品久久久久中文字幕欢迎你| 黄色免费成人| 欧美精品播放| 欧美成人第一页| 亚洲欧美不卡| 欧美成人蜜桃| 国内精品久久久久久久影视蜜臀 | 一本久道久久久| 久久综合久久综合久久| 伊人天天综合| 日韩亚洲欧美高清| 久久国产婷婷国产香蕉| 久久成人国产精品| 亚洲精品一区二区三区樱花| 亚洲欧洲在线一区| 亚洲午夜激情| 久久久一二三| 最新热久久免费视频| 久久精品国产欧美亚洲人人爽| 欧美视频不卡| 亚洲高清一区二| 日韩午夜精品| 先锋资源久久| 国产精品久久777777毛茸茸|