ifstream无法阅读

时间:2013-11-28 01:47:31

标签: c++ object ifstream

我正在创建两个函数来保存对象并将其加载到程序中。

保存功能显然成功保存了对象:

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
};

加载时,始终显示“读取失败”消息,有什么不对?

2 个答案:

答案 0 :(得分:1)

使用指针编写结构会写入指针的值,而不是指向对象的值。 你需要研究序列化。序列化是一种将数据结构化为连续非结构化介质(如硬盘驱动器)的方法。即,如何将您的信息结构化为一行位,这样您就可以从同一行位重建对象。之前链接的提升库是一个选项,但您还应该检查XMLJSONother solutions

答案 1 :(得分:0)

一般方法是使用“infile&gt;&gt; myGame”。在Game类中,定义运算符&lt;&lt;和运算符&gt;&gt;使用为您的Game类定制的版本覆盖默认值。

这些功能通常有一个&gt;&gt;列表或&lt;&lt;对于类的每个成员(如果没有定义运算符,则为默认值)。但是你需要做出一些决定并为指针类型成员编写一些代码。内存中对象的位置将从运行变为运行,因此您不能只保存和加载指针值。例如,可能在Game :: operator&lt;&lt;你需要调用&lt;&lt;在myMine上转储它(深层复制)。但也许Miner是指向一个单独保存和加载的数组的指针,所以Game :: operator&lt;&lt;保存矿工ID号或名称字符串和游戏运营商&gt;&gt;使用保存的数据查找Miner以获取指针。