首页 > 其他 > 详细

CMoReader

时间:2014-02-23 13:28:54      阅读:219      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
#ifndef __E3GLOGLOADBYFILE_H__ 
#define __E3GLOGLOADBYFILE_H__ 
  
#include "PubCommon\MemoryManager.h" 
#include "PubCommon.h" 
  
//------------------------ 
// 读取内存中的 LOG 文件 
//------------------------ 
class CMoReader 
{ 
public: 
    CMoReader(Win32Tools::CMemoryManager* pMemMgr); 
    virtual ~CMoReader(void); 
public: 
    bool LoadFile(char* pFileMemory); 
    void GetMemLine(CMemLine*& pMemLine); 
    bool IsEof(); 
private: 
    size_t GetBufSize(PCHAR pBuf); 
    bool ReadLine(CMemLine*& pMemLine); // 读取一行数据 
    bool MoveToLineEnd();   // 移动到行尾 
    bool MoveToNextLine();  // 移动到下一行 
private: 
    char*   m_pMemory;      // 文件流的位置 
    char*   m_pReadPos;     // 当前读取的位置 
    int     m_nCount;       // 总计读取的行数 
private: 
    Win32Tools::CMemoryManager* m_pMemMgr; 
}; 
  
#endif 
bubuko.com,布布扣
bubuko.com,布布扣
#include "stdafx.h" 
#include "MoReader.h" 
#include "PubCommon\FileFormatDefine.h" 
  
CMoReader::CMoReader(Win32Tools::CMemoryManager* pMemMgr) 
    : m_nCount(0) 
    , m_pMemMgr(pMemMgr) 
    , m_pMemory(NULL) 
    , m_pReadPos(NULL) 
{ 
} 
  
CMoReader::~CMoReader(void) 
{ 
} 
  
bool CMoReader::LoadFile(char* pFileMemory) 
{ 
    // 加载信息 
      
    if(pFileMemory == NULL) 
        return false; 
    m_pMemory = pFileMemory; 
    m_pReadPos = pFileMemory; 
    return true; 
} 
  
void CMoReader::GetMemLine(CMemLine*& pMemLine) 
{ 
    // 首行数据 
    pMemLine = (CMemLine*)m_pMemMgr->GetMemory(sizeof(CMemLine)); 
    pMemLine = new (pMemLine) CMemLine; 
    CMemLine* pOld = pMemLine; 
  
    while(1) 
    { 
        // 依次追加的行 
        CMemLine* pNew = (CMemLine*)m_pMemMgr->GetMemory(sizeof(CMemLine)); 
        pNew = new (pNew) CMemLine; 
        if(false == ReadLine(pNew)) 
            break; 
        if(*(pNew->m_pLine) == =) 
        { 
            if(3 <= ++m_nCount)  // 完整对象判断 
            { 
                break; 
            } 
            continue; 
        } 
        if(*(pNew->m_pLine) != \0 && (NUMBER_ZERO != m_nCount)) 
        { 
            pMemLine->m_pNextLine = pNew; 
            pMemLine = pNew; 
        } 
    } 
    if (3 != m_nCount)                  // 结尾非法对象处理 
    { 
        pOld->m_pNextLine = NULL; 
    } 
    pMemLine = pOld; 
    pMemLine = pMemLine->m_pNextLine; 
    m_nCount = 1; 
} 
  
bool CMoReader::IsEof() 
{ 
    return (*m_pReadPos == FILE_END_CHAR); 
} 
  
size_t CMoReader::GetBufSize(PCHAR pBuf) 
{ 
    size_t iRelt(0); 
    while(*pBuf++ != \0) 
    { 
        ++iRelt; 
    } 
    return iRelt; 
} 
  
bool CMoReader::MoveToLineEnd() 
{ 
    // 移动到行尾 
  
    if(*m_pReadPos == \r || *m_pReadPos == \0 || *m_pReadPos == \n || *m_pReadPos == FILE_END_CHAR) 
        return false; 
  
    do
    { 
        ++m_pReadPos; 
    } 
    while(*m_pReadPos != \r && *m_pReadPos != \0 && *m_pReadPos != \n && *m_pReadPos != FILE_END_CHAR); 
    return true; 
} 
  
bool CMoReader::MoveToNextLine() 
{ 
    // 移动到下一行 
  
    MoveToLineEnd(); // 首先移动至行尾 
    if(*m_pReadPos == FILE_END_CHAR) 
        return false; 
  
    while(*m_pReadPos == \r || *m_pReadPos == \n || *m_pReadPos == \0) 
    { 
        if(*m_pReadPos == FILE_END_CHAR) 
            return false; 
        ++m_pReadPos; 
    } 
    return true; 
} 
  
bool CMoReader::ReadLine(CMemLine*& pMemLine) 
{ 
    // 读取一行数据 
  
    char* pBegin = m_pReadPos; 
    if(MoveToLineEnd() == false) 
        return false; 
    char* pEnd = m_pReadPos; 
    size_t iSize = pEnd - pBegin; 
    pMemLine->m_pLine = pBegin; 
    pMemLine->m_iLength = iSize; 
    *pEnd = \0; 
    return MoveToNextLine(); 
} 
bubuko.com,布布扣

CMoReader

原文:http://www.cnblogs.com/hongjiumu/p/3561511.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!