我创建了两个函数来保存和加载一个对象到程序中。ifstream无法读取
保存功能aparently成功保存对象:
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
}
的问题似乎是在负载功能,因为从所读取的对象的整数返回的值是不正确。
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
};
加载时,总是显示 “读取失败” 的消息,什么是错?
没有看到“游戏”的定义,很难说明原因。我会说保存一个'struct'或'class'的二进制图像只有当它是一个没有指针的POD类型时才会工作。即便如此,这并不是最强大的做事方式。 (它通常会跨越平台,例如,在许多情况下,包括32位和64位x86之间,取决于结构的内容。) –
嗯,我已经添加了游戏信息。基本上有更好的方法来保存类文件中的所有数据吗? – xRed
是的,使用'write'和'read'完全不适用于这种结构。 :-)这些指针将无效,并且不会保存指向的数据。你会想查找_serialization的主题._ Boost有一个序列化库,尽管我从来没有使用它。看这里:http://www.boost.org/doc/libs/1_55_0/libs/serialization/doc/index.html 否则,你将不得不写一些自定义的行为结构和存储它,以及一些东西其他自定义,读取您存储的内容并创建/填充新结构。 –