我创建了两个函数来保存对象并将其加载到程序中。
save函数独立地成功保存对象:
void Game::SaveGame()
{
std::string filename = "saves/miner-save-" + currentDate() + ".gem";
std::ofstream outfile;
outfile.open(filename.c_str(), std::ios::binary);
outfile.write((char *)(&myGame), sizeof(Game));
if (outfile.fail())
std::cout << "write failed" << std::endl;
outfile.close();
std::cout << myGame->myMiner->getX(); //debug purposes : prints 25
}
问题似乎出在load函数中,因为从读取的对象的整数返回的值是不正确的。
void Game::LoadGame()
{
..some code..
std::string filename = GetLoadFilename(nameID); //works
std::ifstream infile;
infile.open(filename, std::ios::binary);
infile.read((char *)&myGame, sizeof(Game));
if (infile.fail())
{
std::cout << "read failed" << std::endl;
}
std::cout << myGame->myMiner->getX(); //debug purposes : prints -842150451
Play(myGame->myMiner->getX(), myGame->myMiner->getY());
}
班级游戏:
class Game {
Game *myGame;
Miner *myMiner;
BlockTypes *myBlockTypes;
//Block* myBlocks[10000];
Consola *myConsole;
Mine *myMine;
int linhas, colunas;
int _currentStatus;
public:
..some functions such as load & save
};
加载时,总是显示"read failed“消息,有什么问题吗?
发布于 2013-11-28 10:22:58
使用指针编写结构会写入指针的值,而不是指向的对象的值。您需要研究序列化。序列化是一种将数据结构化到连续的非结构化介质(如硬盘驱动器)上的方法。也就是说,如何将你的信息组织成一行比特,这样你就能够从同一行比特重建你的对象。之前链接的boost库是一个选择,但也有XML、JSON和other solutions是您应该检查的。
发布于 2013-11-28 10:45:54
一般的方法是使用"infile >> myGame“。在游戏类中,定义operator<<和operator>>以使用为游戏类自定义的版本覆盖默认值。
对于类的每个成员,这些函数通常都有一个>>或<<列表(如果您没有定义运算符,这是默认的)。但您需要做出一些决定,并为指针类型成员编写一些代码。对象在内存中的位置将从一个运行移动到另一个运行,因此您不能只保存和加载指针值。例如,在Game::operator<<中,您可能需要在myMine上调用<<来转储它(深度复制)。但是也许Miner是一个指向数组的指针,该数组是单独保存和加载的,因此Game::operator<<保存了一个miner id号或名称字符串,而游戏operator>>使用保存的数据来查找Miner以获取指针。
https://stackoverflow.com/questions/20256351
复制相似问题