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

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>
            亚洲激情在线激情| 久久国产加勒比精品无码| 亚洲一区亚洲| 9l国产精品久久久久麻豆| 亚洲第一区色| 亚洲伦理在线| 亚洲免费一区二区| 欧美中文字幕在线| 久热成人在线视频| 欧美激情精品久久久久久变态| 亚洲第一精品福利| 亚洲国产成人久久综合一区| 亚洲精品欧美在线| 午夜精品国产更新| 久久精品综合| 欧美日韩在线一二三| 国产欧美一区二区精品忘忧草| 国产视频一区在线观看| 亚洲福利视频网站| 亚洲一级黄色av| 免费观看日韩| 亚洲无玛一区| 免费在线欧美视频| 国产伦精品一区二区三区免费| 精品动漫3d一区二区三区| 亚洲精品少妇30p| 久久精品国产欧美亚洲人人爽| 狼人社综合社区| 亚洲私人影院| 欧美精品九九| 亚洲第一页自拍| 欧美一区二区三区在| 亚洲一区二区三区精品视频| 欧美韩日亚洲| 中文亚洲字幕| 欧美国产免费| 国内视频精品| 亚洲男人av电影| 欧美高清一区二区| 亚洲自拍偷拍色片视频| 欧美精品激情在线观看| 永久555www成人免费| 亚洲欧美日韩在线高清直播| 亚洲国产高清在线观看视频| 欧美在线视频播放| 国产精品伦子伦免费视频| 亚洲精品视频在线播放| 欧美成人高清视频| 久久久久久亚洲综合影院红桃 | 亚洲成人在线视频播放| 亚洲欧美国产日韩中文字幕| 亚洲国产婷婷香蕉久久久久久| 欧美一级电影久久| 国产欧美日韩综合| 性欧美videos另类喷潮| 99国产精品99久久久久久粉嫩| 欧美精品成人一区二区在线观看 | 一区二区三区久久网| 欧美电影在线观看| 亚洲欧洲精品一区| 欧美成人免费在线视频| 久久婷婷国产综合尤物精品| 国产主播喷水一区二区| 久久亚洲免费| 久久久水蜜桃av免费网站| 在线观看欧美| 欧美顶级大胆免费视频| 欧美aaaaaaaa牛牛影院| 日韩视频永久免费观看| 亚洲精品国产精品国自产观看浪潮| 欧美/亚洲一区| 9久草视频在线视频精品| 亚洲人精品午夜| 欧美偷拍一区二区| 香港久久久电影| 久久国产精品久久w女人spa| 国产亚洲精品久久久久婷婷瑜伽 | 国产一区二区三区在线观看精品| 久久国产手机看片| 久久综合中文色婷婷| 一区二区欧美国产| 亚洲伊人网站| 亚洲国产1区| 99在线精品观看| 国产日韩欧美在线视频观看| 亚洲经典三级| 亚洲麻豆一区| 亚洲在线日韩| 亚洲国产精品嫩草影院| 洋洋av久久久久久久一区| 国产农村妇女毛片精品久久麻豆| 老司机成人在线视频| 欧美日韩精品久久久| 欧美在线观看视频一区二区| 男人插女人欧美| 欧美一区激情| 欧美激情精品久久久久久大尺度| 香蕉久久夜色精品国产使用方法 | 快播亚洲色图| 亚洲在线视频一区| 久久久噜噜噜久久中文字幕色伊伊| 日韩手机在线导航| 欧美一区二区免费| 国产精品99久久99久久久二8| 久久九九99| 午夜在线视频观看日韩17c| 蜜月aⅴ免费一区二区三区 | 久久人人看视频| 国产精品yjizz| 亚洲国产成人精品久久| 国产一区二区三区四区五区美女| 亚洲六月丁香色婷婷综合久久| 韩国女主播一区二区三区| 国产精品99久久久久久www| 亚洲国产人成综合网站| 久久国产手机看片| 亚洲欧美影院| 欧美三级电影一区| 亚洲人成网站精品片在线观看| 精品动漫一区| 欧美在线视频免费观看| 小辣椒精品导航| 国产精品福利av| 一区二区三区欧美视频| 中文欧美在线视频| 欧美日本不卡高清| 亚洲黄色大片| 日韩午夜三级在线| 欧美激情免费观看| 91久久线看在观草草青青| 亚洲国产视频一区二区| 久久久水蜜桃av免费网站| 猛男gaygay欧美视频| 在线不卡中文字幕| 久久蜜桃精品| 亚洲国产成人91精品 | 久久精品国产精品亚洲| 国产免费成人在线视频| 午夜精品福利在线观看| 欧美综合二区| 有码中文亚洲精品| 久久人人97超碰精品888| 欧美va亚洲va日韩∨a综合色| 在线观看欧美精品| 欧美亚洲系列| 久久久视频精品| 亚洲福利视频免费观看| 欧美电影电视剧在线观看| 欧美激情视频网站| 亚洲欧洲99久久| 久久久久网址| 亚洲精品视频免费观看| 欧美日韩一二三区| 亚洲在线免费观看| 蜜桃久久精品一区二区| 亚洲精品视频中文字幕| 欧美视频在线视频| 欧美影院成人| 亚洲高清不卡一区| 亚洲一区二区三| 狠狠久久亚洲欧美专区| 欧美高清视频在线| 亚洲性av在线| 欧美成人在线网站| 亚洲一区二区三区在线看| 国产日韩在线播放| 欧美激情第五页| 午夜欧美大尺度福利影院在线看| 欧美.com| 欧美诱惑福利视频| 亚洲美女黄网| 国内精品国语自产拍在线观看| 欧美精品aa| 欧美在线免费一级片| 亚洲最快最全在线视频| 蜜桃久久精品一区二区| 香蕉久久夜色精品国产| 亚洲人成毛片在线播放| 国产日韩欧美一区二区三区在线观看| 蜜臀av一级做a爰片久久| 午夜激情亚洲| 一本不卡影院| 亚洲国产精品99久久久久久久久| 午夜视频在线观看一区二区| 亚洲国产精品一区二区尤物区| 国产精品久久久久一区二区| 蜜臀久久99精品久久久久久9| 午夜免费久久久久| 99精品国产一区二区青青牛奶| 欧美国产日本韩| 久久嫩草精品久久久久| 亚洲欧美成人| 中日韩高清电影网| 亚洲电影在线观看| 国产欧美在线视频| 国产精品黄视频| 欧美日韩视频不卡| 欧美粗暴jizz性欧美20| 久久野战av| 久久亚洲电影|