Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用流崩溃C++;_C++_Ofstream_Char Pointer - Fatal编程技术网

C++ 使用流崩溃C++;

C++ 使用流崩溃C++;,c++,ofstream,char-pointer,C++,Ofstream,Char Pointer,我使用的IDE(visual studio 2012)没有显示任何错误或警告,但我基本上是在尝试将二进制数据写入一个名为wizdata.bin的文件,并且我已经声明了向导类的一些对象。Wizard类有几个具有4个成员变量(1个字符串和3个整数)的函数。当我在向导类中调用名为“save”的函数时,控制台程序停止工作,但它确实能够写入向导类成员变量名,即字符串。之后,它将无法写入类中的任何int。所以问题是,我尝试将int写入二进制文件有什么错?Wizard.cpp中推荐的部分导致崩溃 这是我的代码

我使用的IDE(visual studio 2012)没有显示任何错误或警告,但我基本上是在尝试将二进制数据写入一个名为wizdata.bin的文件,并且我已经声明了向导类的一些对象。Wizard类有几个具有4个成员变量(1个字符串和3个整数)的函数。当我在向导类中调用名为“save”的函数时,控制台程序停止工作,但它确实能够写入向导类成员变量名,即字符串。之后,它将无法写入类中的任何int。所以问题是,我尝试将int写入二进制文件有什么错?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
这是我加载数据的第二个控制台应用程序的“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;
    }
#包括“Wizard.h”
#包括
使用名称空间std;
int main()
{
巫师wiz0;
向导wiz1;
巫师wiz2;
简短的回答:


使用shift运算符“write的第一个参数应该是指向要写入的数据的指针。请尝试以下操作:

outFile.write( (char*)&hitPoints, sizeof(hitPoints) );

这解决了问题,但现在我正在尝试将保存的数据加载到另一个控制台应用程序中。它确实加载了数据,但在第一个向导类之后,数据似乎出现了问题,显示向导loki拥有17000多个生命点、魔法点和护甲。知道为什么数据加载不正确吗?我更新了加载函数。我认为你应该这样做e> outFile.write(name.c_str(),name.size()+1);
函数在字符串末尾添加空字符。感谢您提供的快速帮助,我现在设法找到了问题的原因。当我以二进制格式将字符串数据保存到文件中时,我还需要将字符串大小作为int保存到字符串之前的文件中,以便我知道需要为字符串获取多少字节。
    #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;
    }
outFile.write( (char*)&hitPoints, sizeof(hitPoints) );