0

我正在使用的 IDE(visual studio 2012)没有显示任何错误或警告,但我基本上是在尝试将二进制数据写入一个名为 wizdata.bin 的文件,并且我已经声明了我的 Wizard 类的一些对象。Wizard 类的函数很少,有 4 个成员变量(1 个字符串和 3 个整数)。当我在 Wizard 类中调用名为“save”的函数时,控制台程序停止工作,但它确实设法编写了 Wizard 类成员变量名称,它是一个字符串。之后,它无法写入类中的任何整数。所以问题是我在尝试将整数写入二进制文件时做错了什么?Wizard.cpp 中推荐的部分导致崩溃。

这是我的代码文件:

向导.h:

    #ifndef WIZARD_H
    #define WIZARD_H

    #include <string>
    #include <fstream>

    class Wizard
    {
    public:
        Wizard();
        Wizard( std::string name, int hp, int mp, int armor );

        void print();

        void save( std::ofstream& outFile );
        void load( std::ifstream& inFile );

    private:
        std::string name;
        int hitPoints;
        int magicPoints;
        int armor;
    };

    #endif

向导.cpp:

    #include "Wizard.h"
    #include <iostream>
    using namespace std;

    Wizard::Wizard()
    {
        name = "Default";
        hitPoints = 0;
        magicPoints = 0;
        armor = 0;
    }

    Wizard::Wizard( string name, int hp, int mp, int armor )
    {
        this->name = name;
        hitPoints = hp;
        magicPoints = mp;
        this->armor = armor;
    }

    void Wizard::print()
    {
        cout << "Name= " << name << endl;
        cout << "HP= " << hitPoints << endl;
        cout << "MP= " << magicPoints << endl;
        cout << "Armor= " << armor << endl;
        cout << endl;
    }

    void Wizard::save( ofstream& outFile )
    {
        outFile.write( name.c_str(), name.size() );
        //outFile.write( (char*)hitPoints, sizeof(hitPoints) );
        //outFile.write( (char*)magicPoints, sizeof(magicPoints) );
        //outFile.write( (char*)armor, sizeof(armor) );
    }

    void Wizard::load( ifstream& inFile )
    {
        inFile.read( (char*)name.c_str(), name.size() );
        inFile.read( (char*)&hitPoints, sizeof(hitPoints) );
        inFile.read( (char*)&magicPoints, sizeof(magicPoints) );
        inFile.read( (char*)&armor, sizeof(armor) );
    }

和 Main.cpp:

    #include "Wizard.h"
    using namespace std;

    int main()
    {
        Wizard wiz0( "Gandalf", 25, 100, 10 );
        Wizard wiz1( "Loki", 50, 150, 12 );
        Wizard wiz2( "Magius", 10, 75, 6 );

        ofstream outFile;
        outFile.open( "wizdata.bin", ios_base::binary );

        if( outFile )
        {
            wiz0.save( outFile );
            wiz1.save( outFile );
            wiz2.save( outFile );

            outFile.close();
        }

        return 0;
    }

这是加载数据的第二个控制台应用程序的“Main.cpp”:

    #include "Wizard.h"
    #include <iostream>
    using namespace std;

    int main()
    {
        Wizard wiz0;
        Wizard wiz1;
        Wizard wiz2;

        cout << "BEFORE LOADING..." << endl;
        wiz0.print();
        wiz1.print();
        wiz2.print();

        ifstream inFile;
        inFile.open( "wizdata.bin", ios_base::binary );

        if( inFile )
        {
            wiz0.load( inFile );
            wiz1.load( inFile );
            wiz2.load( inFile );

            inFile.close();
        }

        cout << "AFTER LOADING..." << endl;
        wiz0.print();
        wiz1.print();
        wiz2.print();

        return 0;
    }

加载数据后,这些是值: 名称:甘道夫 HP:25 MP:100 护甲:10

名称:Loki2 生命值:38400 MP:3072 护甲:1734429952

名称:ius HP:75 MP:6 护甲:0

4

2 回答 2

1

简短的回答:

使用移位运算符 '<<' 而不是 write ()。

稍微长一点的答案:

问题在于演员阵容。(char *)number 将数字解释为一个指针,它当然不能指向任何有意义的东西。

于 2013-11-23T19:24:11.253 回答
0

write 的第一个参数应该是指向要写入的数据的指针。所以试试这个:

outFile.write( (char*)&hitPoints, sizeof(hitPoints) );
于 2013-11-23T19:26:36.623 回答