当前位置: 首页 > 图文教程 > 开发语言 > VC++ > FMD开发文集 -- CArchive原理
FMD开发文集 -- CArchive原理 MFC 提供CArchive类实现数据的缓冲区读写,同时定义了类对象的存储与读取方案。 以下对CArchvie 的内部实现作分析。 1.概述
当建立CArchive对象时,应指定其模式是用于缓冲区读,还是用于缓冲区写。 可以这样理解,CArchive对象相当于铁路的货运练调度站,零散的货物被收集,当总量到达火车运量的时候,由火车装运走。 当接到火车的货物时,则货物由被分散到各自的货主。与货运不同的是,交货、取货是按时间循序执行的,而不是凭票据。因此必须保证送货的和取货的货主按同样的循序去存或取。 对于大型的货物,则是拆散成火车单位,运走,取货时,依次取各部分,组装成原物。 m_lpBufCur = (IsLoading()) ? m_lpBufMax : m_lpBufStart; 对于基本的数据类型,例如字节、双字等,可以直接使用">>"、"<<"符号进行读出、写入。 //操作符定义捕: //插入操作CArchive& operator<<(BYTE by);CArchive& operator<<(WORD w);CArchive& operator<<(LONG l);CArchive& operator<<(DWORD dw);CArchive& operator<<(float f);CArchive& operator<<(double d);CArchive& operator<<(int i);CArchive& operator<<(short w);CArchive& operator<<(char ch);CArchive& operator<<(unsigned u);//提取操作CArchive& operator>>(BYTE& by);CArchive& operator>>(WORD& w);CArchive& operator>>(DWORD& dw);CArchive& operator>>(LONG& l);CArchive& operator>>(float& f);CArchive& operator>>(double& d);CArchive& operator>>(int& i);CArchive& operator>>(short& w);CArchive& operator>>(char& ch);CArchive& operator>>(unsigned& u);下面以双字为例,分析原码 双字的插入(写) 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;} 以上操作中,当缓冲区将插入满或缓冲区将提取空时,都将对缓冲区进行更新处理。 缓冲区将插入满时调用Flush(); void CArchive::Flush(){ ASSERT_VALID(m_pFile); ASSERT(m_bDirectBuffer || m_lpBufStart != NULL); ASSERT(m_bDirectBuffer || m_ |