【问题标题】:Reading multiple serialized objects from a file从文件中读取多个序列化对象
【发布时间】:2019-01-19 22:29:18
【问题描述】:

在 MFC 中制作我的 Breakout 游戏时,我选择序列化我的 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++ serialization mfc


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      相关资源
      最近更新 更多