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

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

有時(shí)我想,如果編程在這些地方磨洋工的話,恐怕一個(gè)大的工程軟件寫起來(lái)得好長(zhǎng)時(shí)間。所以說(shuō)盡量已組件的方式,類的思路來(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 閱讀(6534) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            18成人免费观看视频| 亚洲卡通欧美制服中文| 欧美视频一区二区在线观看| 午夜国产精品影院在线观看 | 国产喷白浆一区二区三区| 欧美jizz19性欧美| 葵司免费一区二区三区四区五区| 夜夜爽av福利精品导航| 亚洲黄色尤物视频| 毛片基地黄久久久久久天堂| 亚洲小说区图片区| 亚洲欧美视频在线| 久久久99精品免费观看不卡| 久久久www成人免费无遮挡大片| 久久激情中文| 国产精品美女一区二区在线观看| 男人插女人欧美| 欧美亚男人的天堂| 国产综合色一区二区三区| 在线观看欧美日本| 亚洲一区二区黄| 免费看亚洲片| 亚洲视频中文| 男人的天堂成人在线| 国产精品久久久久一区二区三区 | 老司机成人网| 欧美视频在线观看| 在线日本成人| 欧美一区二区高清在线观看| 美女脱光内衣内裤视频久久影院| 亚洲精品美女久久7777777| 午夜精品国产更新| 欧美三级视频| 日韩一级免费| 亚洲人成在线观看| 久久一区欧美| 激情视频亚洲| 久久综合五月天婷婷伊人| 夜夜嗨av一区二区三区免费区| 久久综合久久综合这里只有精品| 国产精品人人做人人爽人人添| 日韩一级大片在线| 亚洲区中文字幕| 欧美色欧美亚洲另类二区| 一区二区三区视频免费在线观看| 麻豆精品传媒视频| 久久性天堂网| 两个人的视频www国产精品| 国产区日韩欧美| 欧美一区网站| 免费观看亚洲视频大全| 亚洲免费久久| 亚洲一区二区三区中文字幕| 欧美日韩中文在线| 欧美亚洲专区| 欧美91视频| 亚洲欧美中文日韩在线| 亚洲一区二区三区精品视频| 国产一区二区看久久| 能在线观看的日韩av| 欧美日韩一区二区三区在线看| 亚洲女人天堂av| 久久久久久高潮国产精品视| 日韩特黄影片| 久久一二三区| 久久美女性网| 国产精品一区亚洲| 一区二区免费在线视频| 一区福利视频| 久久精彩视频| 欧美资源在线| 国产精品香蕉在线观看| 亚洲国产一区二区精品专区| 国产精品综合久久久| 亚洲欧洲一区二区三区| 日韩视频精品在线观看| 久久这里有精品视频| 美女黄网久久| 亚洲国产精品成人va在线观看| 亚洲天堂网站在线观看视频| 亚洲国产欧美在线| 欧美成人一区二区在线| 久久午夜av| 欧美午夜精品久久久久久孕妇| 亚洲嫩草精品久久| 伊人影院久久| 久久精品国产精品| 欧美日韩精品欧美日韩精品| 亚洲国产经典视频| 亚洲九九九在线观看| 欧美高清不卡| 亚洲综合精品四区| 久久男人资源视频| 日韩天堂av| 国产日韩综合| 欧美不卡一区| 午夜精彩国产免费不卡不顿大片| 久久九九精品99国产精品| 永久免费精品影视网站| 欧美顶级艳妇交换群宴| 这里是久久伊人| 鲁鲁狠狠狠7777一区二区| 日韩午夜激情电影| 国产无一区二区| 欧美日韩国产另类不卡| 午夜精品视频在线观看一区二区| 老色鬼久久亚洲一区二区| 亚洲精品欧洲| 在线观看91精品国产麻豆| 欧美日韩免费一区二区三区| 久久99在线观看| 亚洲欧美高清| 亚洲综合日韩| 亚洲午夜一区二区| 99成人在线| 亚洲精选在线| 亚洲美女诱惑| 日韩视频在线免费观看| 亚洲精品美女| 亚洲午夜精品视频| 在线一区免费观看| 一本大道久久精品懂色aⅴ| 亚洲精品专区| 影音先锋亚洲视频| 亚洲第一页中文字幕| 国内久久精品| 国内在线观看一区二区三区| 国产日韩欧美高清| 国产日产欧美精品| 激情欧美一区二区三区| 在线播放国产一区中文字幕剧情欧美 | 国产揄拍国内精品对白| 伊甸园精品99久久久久久| 日韩一级免费| 久久久精品999| 欧美承认网站| 中国成人在线视频| 暖暖成人免费视频| 国产私拍一区| 中文高清一区| 欧美黄免费看| 欧美专区日韩视频| 国产精品成人一区二区| 1024欧美极品| 欧美资源在线| 亚洲一区激情| 欧美日韩成人综合在线一区二区| 国产精品视频导航| 亚洲色图在线视频| 亚洲国产欧美国产综合一区| 午夜精品影院| 国产情侣一区| 久久久久久久999精品视频| 亚洲精品一区二区三区四区高清| 亚洲在线一区二区三区| 欧美三日本三级三级在线播放| 亚洲国产精品第一区二区三区| 欧美一区二区三区四区在线观看地址 | 国产精品入口| 韩日欧美一区二区| 性色av一区二区三区| 99精品热视频| 国产日韩欧美制服另类| 欧美资源在线| 久久亚洲欧美国产精品乐播| 国产一区二区在线观看免费播放| 欧美一级专区免费大片| 欧美一区二区在线播放| 国产一区二区三区四区三区四| 欧美在线一级va免费观看| 欧美在线视频a| 亚洲日本一区二区| 亚洲一区精品视频| 亚洲高清av| 亚洲夜间福利| 亚洲国产高清自拍| 中文亚洲欧美| 亚洲激情精品| 小处雏高清一区二区三区| 亚洲精品久久7777| 亚洲欧美制服中文字幕| 亚洲激情在线播放| 欧美一区91| 亚洲在线观看视频网站| 免费不卡中文字幕视频| 欧美在线视频免费| 欧美日韩亚洲激情| 亚洲国产成人精品久久久国产成人一区 | 亚洲一区黄色| 亚洲国产高清aⅴ视频| 亚洲一区欧美二区| 中文欧美字幕免费| 欧美成人国产| 亚洲激情视频网站| 亚洲三级电影全部在线观看高清| 午夜伦理片一区| 欧美理论电影在线观看| 亚洲国产一区二区在线| 亚洲国产综合在线| 欧美成人久久|