我創建了兩個函數來保存和加載一個對象到程序中。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 否則,你將不得不寫一些自定義的行爲結構和存儲它,以及一些東西其他自定義,讀取您存儲的內容並創建/填充新結構。 –