Запись данных с офсетным сбоем переполнения стека

IDE, которую я использую (Visual Studio 2012), не показывает никаких ошибок или предупреждений, но я в основном пытаюсь записать двоичные данные в файл с именем wizdata.bin, и я объявил несколько объектов моего класса Wizard. класс Wizard имеет несколько функций с 4 переменными-членами (1 строка и 3 целых). Когда я вызываю функцию в классе Wizard с именем «save», консольная программа перестает работать, но ей удается записать имя переменной члена класса Wizard, которая является строкой. После этого он не может написать ни одного целого в классе. Итак, вопрос в том, что я делаю не так, пытаясь записать целые числа в двоичный файл? часть, которая рекомендуется в Wizard.cpp, вызывает сбой.

вот мои файлы кода:

Wizard.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

Wizard.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

Имя: Локи2
HP: 38400
МП: 3072
Броня: 1734429952

Имя: ius
HP: 75
МП: 6
Броня: 0

0

Решение

Первым аргументом записи должен быть указатель на данные, которые вы хотите записать. Так что попробуйте это:

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

Другие решения

Короткий ответ:

Используйте оператор сдвига<<вместо записи ().

Немного дольше отвечу:

Проблема в актерском составе. (char *) число интерпретирует число как указатель, который, конечно, не может указывать на что-либо значимое.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector