从一个文件中读取多个序列化对象

Reading multiple serialized objects from a file

本文关键字:读取 序列化 对象 一个 文件      更新时间:2023-10-16

在MFC中制作我的突破游戏时,我选择序列化我的CBlock对象,以便玩家可以在我制作的关卡编辑器上制作自己的"地图",保存时一切都很好;我所做的一切都是用for序列化我所有的CBlock对象,因为我所有的CBlock对象都在vector<CBlock*>上。读取文件时出现问题。主要问题是我的程序不知道如何在文件结束时停止读取。我已经尝试了CArchive的大多数bool方法。唯一有点有效的是CArchive::IsLoading()但问题是尽管已经到达文件末尾,但它仍然继续从文件中读取。

CString m_filter = TEXT("Super Breakout Maker Files (*.sbm)|*.sbm|All Files (*.*)|*.*||");
CFile m_loadFile;
CFileDialog m_fileDlg(TRUE, TEXT(".sbm"), TEXT("mylayout"), OFN_HIDEREADONLY, m_filter, NULL, 0, TRUE);
//CFileDialog m_fileDlg(FALSE, TEXT(".sbm"), TEXT("mylayout"), 0, m_filter);
if (m_fileDlg.DoModal() == IDOK)
{
if (m_blockLayout.size() > 0)
{
for (int i = 0; i < m_blockLayout.size(); i++)
{
delete(m_blockLayout[i]);
}
m_blockLayout.clear();
}
m_loadFile.Open(m_fileDlg.GetFileName(), CFile::modeRead);
CArchive m_loadArchive(&m_loadFile, CArchive::load);
while (m_loadArchive.IsLoading()==true)
{
CBlock* block = new CBlock;
block->Serialize(m_loadArchive);
block->AssignBlockType();
block->m_blockState.CreateCompatibleDC(pDC);
LoadBlock(block->m_blockState, m_blockStateArray, block->GetBlockType(), block->GetHits());
m_blockLayout.push_back(block);
}
m_loadArchive.Close();
if (m_blockLayout.size() > 0)
{
MessageBox(TEXT("Your layout was successfully loaded! Resume game to play."), TEXT("Notification"), MB_ICONINFORMATION);
m_pBall->SetInitialPosition(m_ballBMP, m_pBar, m_barBMP);
}
else
{
MessageBox(TEXT("Unable to read file. Corrupted or incompatible data."), TEXT("Notification"), MB_ICONERROR);
}
}
else
{
return;
}
m_loadFile.Close();

这是我的加载方法,但正如我提到的,迭代不知道在哪里结束阅读。

几个更简单的选项,最简单的方法是将文件中有多少块存储为块之前的文件的第一件事。阅读这么多块,然后退出。

有一个具有特定属性和成员变量的预定义块,即您的"文件结束"块,每当您读取该特定块时,您都知道丢弃它并停止读取。

另一种选择是在所有块数据的末尾添加一些特定的字符串,并在读取每个块以获取该特定字符串后检查下一行(不过,这需要文件中行的一些指针变量(