从一个文件中读取多个序列化对象
Reading multiple serialized objects from a file
在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();
这是我的加载方法,但正如我提到的,迭代不知道在哪里结束阅读。
几个更简单的选项,最简单的方法是将文件中有多少块存储为块之前的文件的第一件事。阅读这么多块,然后退出。
有一个具有特定属性和成员变量的预定义块,即您的"文件结束"块,每当您读取该特定块时,您都知道丢弃它并停止读取。
另一种选择是在所有块数据的末尾添加一些特定的字符串,并在读取每个块以获取该特定字符串后检查下一行(不过,这需要文件中行的一些指针变量(
相关文章:
- 如何在C++中序列化结构数据
- 序列化,没有库的整数,得到奇怪的结果
- 如何知道QDataStream不能反序列化某些内容
- 如何使用Python从C++中读取谷物序列化数据
- 如何使用boost::具有嵌套结构和最小代码更改的序列化
- 从一个文件中读取多个序列化对象
- 在 C# 中序列化这些值以在C++中作为已知结构正确读取时遇到问题
- 使用提升序列化读取具有批大小的二进制文件
- 提升序列化在从二进制文件读取时引发异常
- 从提升序列化文件读取会引发异常
- 序列化/封送C#中的简单对象以通过网络发送,供非托管C++应用程序读取
- 在没有序列化库的情况下,在 c++ 中从结构体读取和写入文件的最简单方法是什么?
- 如何使用序列化读取char*
- C++:使用Boost序列化来写入/读取文件
- 如何从 QDataStream 中读取多个相同类型的序列化对象
- 反序列化构造函数无法正确读取数据
- 如何通过从文件中读取来反序列化C++的字节数组
- C/C++:如何使用制表从文本文件中读取序列化图形(树)
- Boost序列化:读取不同类型的数据
- C ++ Linux 库,用于创建 XML 和从 XML 读取(序列化/反序列化)