2024年4月2日发(作者:)

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); //移动当前位置指针

//重新读入

内容到缓冲区