mfc初学,本人小白。
继续昨天的工作把我的类进行了改进,发现了不少的错误。
class CCardManage:public CObject
{
public:
CCardManage(void);
~CCardManage(void);
int addOne();
CCardInfo* create();
int deleteOne(int i);
int queryInfo( CCardInfo &ci,int queryType);
int inserOne(CCardInfo* pCI, int iIndex);
virtual void Serialize(CArchive& ar);
std::vector<CCardInfo> m_vciRecord;
int m_Index;
CFile m_file;
private:
DECLARE_SERIAL(CCardManage)
};
红颜色是修改的几个部分,这是穿行化的必要步骤。
以下是实现部分的修改
IMPLEMENT_SERIAL(CCardManage,CObject,1)
void CCardManage::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{ // storing code
for (std::vector<CCardInfo>::iterator p = m_vciRecord.begin();p != m_vciRecord.end();p++)
{
ar <<p->m_cardName<<p->m_cardId<<p->m_cardCar<<p->m_cardDate<<p->m_cardAvailable;
}
}
else
{
try{
while (1)
{
CCardInfo* pCI1;
pCI1 = new CCardInfo();
ar>>pCI1->m_cardName>>pCI1->m_cardId>>pCI1->m_cardCar>>pCI1->m_cardDate>>pCI1->m_cardAvailable;
m_vciRecord.push_back(*pCI1);
}
}
catch(CArchiveException* e)
{
if (e->m_cause != CArchiveException::endOfFile)
{
AfxMessageBox(_T("发生未知错误"));
}
}
}
}
出现问题
1.ar>>(对象)必须是指针,这个应该注意。
2.考虑到CArchive是与CFile关联在一起的,那么在CArchive中操作也会影响到CFile中。这个结论部分正确,当在CArchive对象中进行读取操作的时候,CFile中的指针也会移动,但是这个移动不是一一映射的,例如:在CArchive中读30字节,CFile中的指针可能移到4k字节了。(猜测可能是CArchive自己从文件中读满自己的缓冲区,这样就不用频繁的和CFile交互,提高效率)。
思考
对于CArchive读取有三个想法:first,用文件指针指示是否到文间的结尾,即getPosition() != getLength()。second,使用异常来处理。thrid,在文件头中先写入一共有多少个对象,就能知道有多少个记录了。
讨论
由于问题2中,我们可以知道方法一是不可取的,因为文件指针会率先走到文件结尾出,这样会使得CArchive提前停止,记录读不全。
上面的代码使用方法2来实现的,成功。
方法3,处理起来比较麻烦,不过也成功。