How to write/read classes within classes to binary file C++












-1















I'm working on a project where I have to write a class that contains three other classes as private member variables to a binary file, where it can then be read back into variables to be used in the code. The code writes to the file, but I don't know if it is writing the correct info as when I try to read the file it reads in junk. I have included my current setup, does this look correct? If so, what could be going wrong, and if not, how can I fix this?



If you need me to add any extra code, please ask. Another consideration is that two of the classes being used as member functions for the players objects inherit from other classes.



    if (cFile.is_open())
{
cFile.seekp(ios::beg);
for (int i = 0; i < 3; i++)
{
cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character));
}

cFile.seekg(ios::beg);
for (int i = 0; i < 3; i++)
{
cFile.read(reinterpret_cast<char *>(&playersRead[i]), sizeof(Character));
playersRead[i].display();
}

cFile.close();
}
else
{
cout << "Error opening file." << endl;
}


I've been working on this code for a few days and am really having trouble. I appreciate any help I can get, thanks in advance.






#pragma once
#include <iostream>
using std::ostream;
#include "string.h"
#include "coinPouch.h"
#include "backpack.h"

class Character
{
public:
Character();
Character(String name);
Character(String name, CoinPouch wallet, Backpack storage);
Character(const Character & copy);
~Character();
Character & operator =(const Character & rhs);

friend ostream & operator << (ostream & out, const Character & c);

void purchase(int p, int g, int s, int c);
void income(int p, int g, int s, int c);
void addPotion(const Potion & toAdd);
void checkBalance();
void checkBackpack();
void changeName(const String & newN);
void display();

String getName();
CoinPouch getWallet();
Backpack getStorage();
void setName(String name);
void setWallet(CoinPouch wallet);
void setStorage(Backpack storage);

private:
String m_name;
CoinPouch m_wallet;
Backpack m_storage;

};








#include "character.h"
using std::endl;
using std::cout;

Character::Character() : m_name("Player")
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name) : m_name(name)
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name, CoinPouch wallet, Backpack storage) : m_name(name), m_wallet(wallet), m_storage(storage)
{

}

Character::Character(const Character & copy) : m_name(copy.m_name), m_wallet(copy.m_wallet), m_storage(copy.m_storage)
{

}

Character::~Character()
{

}

Character & Character::operator =(const Character & rhs)
{
if (this != &rhs)
{
m_name = rhs.m_name;
m_wallet = rhs.m_wallet;
m_storage = rhs.m_storage;
}

return *this;
}

ostream & operator << (ostream & out, const Character & c)
{
out << c.m_name << ": " << endl;
out << c.m_wallet << endl;
out << c.m_storage << endl;

return out;
}

void Character::purchase(int p, int g, int s, int c)
{
m_wallet.buy(p, g, s, c);
}

void Character::income(int p, int g, int s, int c)
{
m_wallet.add(p, g, s, c);
}

void Character::addPotion(const Potion & toAdd)
{
m_storage.addPotion(toAdd);
}

void Character::checkBalance()
{
m_wallet.display();
}

void Character::checkBackpack()
{
m_storage.displayContents();
}

void Character::changeName(const String & newN)
{
m_name = newN;
}

void Character::display()
{
cout << m_name << ": " << endl;
m_wallet.display();
m_storage.displayContents();
}

String Character::getName()
{
return m_name;
}

CoinPouch Character::getWallet()
{
return m_wallet;
}

Backpack Character::getStorage()
{
return m_storage;
}

void Character::setName(String name)
{
m_name = name;
}

void Character::setWallet(CoinPouch wallet)
{
m_wallet = wallet;
}

void Character::setStorage(Backpack storage)
{
m_storage = storage;
}








#pragma once
#include <iostream>
using std::ostream;
#include "string.h"

class CoinPouch
{
public:
CoinPouch();
CoinPouch(String init);
CoinPouch(int p, int g, int s, int c);
CoinPouch(const CoinPouch & copy);
~CoinPouch();
CoinPouch & operator = (const CoinPouch & rhs);
friend ostream & operator << (ostream & out, const CoinPouch & c);

void add(int p, int g, int s, int c);
bool checkCost(int p, int g, int s, int c);
void buy(int p, int g, int s, int c);
void convertCost();
void roundUp();
void display();

int getP();
int getG();
int getS();
int getC();

private:
String m_amount;

int m_platinum;
int m_gold;
int m_silver;
int m_copper;
};








#pragma once
#include "potions.h"

class DynamicArray
{
public:
// Constructors
DynamicArray();
~DynamicArray();
DynamicArray(const DynamicArray & copy);

// Op Equals
DynamicArray & operator =(const DynamicArray & rhs);

// Insert, delete, and get elements functions
int getElements();
void Insert(const Potion & add);
void Delete(const Potion & rmv);
void display();

// Overloaded operators
Potion & operator (int index);
friend ostream & operator << (ostream & out, const DynamicArray & d);

private:
// Member variables
Potion * m_array;
int m_elements;

// Find function
int Find(const Potion & target);
};








#pragma once
#include "string.h"
#include <iostream>
using std::ostream;

class Potion
{
public:
// Constructors
Potion();
Potion(String name, String description, String potency, String cost);
Potion & operator = (const Potion & rhs);
Potion(const Potion & copy);

// Desctructor
~Potion();

// Overloaded operators
bool operator == (const Potion & rhs) const;
friend ostream & operator << (ostream & out, const Potion & p);

// Getter functions
String getName();
String getDesc();
String getPotency();
String getCost();
int getP();
int getG();
int getS();
int getC();

// Setter functions
void setName(String name);
void setDesc(String desc);
void setPotency(String potency);
void setCost(String cost);

// Convert and display functions
void convertCost();
void display();

private:
// Strings to hold item information
String m_name;
String m_description;
String m_potency;
String m_cost;

// Ints to hold cost information
int m_platinum;
int m_gold;
int m_silver;
int m_copper;

// Logical test
bool m_isnull = false;
};








#pragma once
#include <iostream>
using std::ostream;

class String
{
public:
// Constructors
String();
String(char ch);
String(const char * str);

// Destructor
~String();

// Copy Constructor and Copy Assignment Constructor
String(const String & copy);
String & operator=(const String & rhs);
friend ostream & operator << (ostream & out, const String & s);

// Added Functionality
void display();
void upper();
void lower();

// Operator Conversion
operator char *();
operator const char *();

// Overloaded operator
bool operator == (const String & rhs) const;

private:
// Member variables
char * m_str;
int m_ischar;

};








#pragma once
#include "dynamicarray.h"
#include "coinPouch.h"
#include "string.h"

class Backpack
{
public:
Backpack();
Backpack(DynamicArray potions);
Backpack(const Backpack & copy);
~Backpack();
Backpack & operator = (const Backpack & rhs);
friend ostream & operator << (ostream & out, const Backpack & c);

void addPotion(const Potion & add);
void usePotion(const Potion & rm);
void displayContents();

private:
DynamicArray m_potions;

int m_number;
};





This is a school project, and I am supposed to write the Character class to a binary file in order to save the characters so I can load them in on the program start. Right now I'm just trying to make sure that they can be successfully written to and read from the binary file and I have had no luck.



My bad, didn't know what to post and I didn't want to post everything in my file. Here is the character class. Let me know what else is needed, if anything.










share|improve this question




















  • 2





    It is logically impossible to determine if this "looks correct", because the shown code fails to meet all requirements of a Minimal, Complete, and Verifiable example, as explained in stackoverflow.com's help center. The best help anyone can give you is to advise you to read stackoverflow.com's help center, take a tour of stackoverflow.com and edit your question to include a Minimal, Complete, and Verifiable example.

    – Sam Varshavchik
    Nov 24 '18 at 2:14






  • 2





    Please post Character. None of this "binary file" stuff works if Character is a non-POD type.

    – PaulMcKenzie
    Nov 24 '18 at 2:17








  • 1





    In case it's not clear what a POD is... What Are POD Types in C++

    – Dave Newman
    Nov 24 '18 at 2:19













  • Please post Character.h. It is the members of Character that needs to be looked at, not the function implementations.

    – PaulMcKenzie
    Nov 24 '18 at 2:55













  • Now what is String? What is CoinPouch? What is BackPack? From the looks of it, none of your code will work for "binary reading or writing". Is this a school assignment? If you were not told what the requirements were to do things like cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character)), then you wound up wasting your time.

    – PaulMcKenzie
    Nov 24 '18 at 3:00


















-1















I'm working on a project where I have to write a class that contains three other classes as private member variables to a binary file, where it can then be read back into variables to be used in the code. The code writes to the file, but I don't know if it is writing the correct info as when I try to read the file it reads in junk. I have included my current setup, does this look correct? If so, what could be going wrong, and if not, how can I fix this?



If you need me to add any extra code, please ask. Another consideration is that two of the classes being used as member functions for the players objects inherit from other classes.



    if (cFile.is_open())
{
cFile.seekp(ios::beg);
for (int i = 0; i < 3; i++)
{
cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character));
}

cFile.seekg(ios::beg);
for (int i = 0; i < 3; i++)
{
cFile.read(reinterpret_cast<char *>(&playersRead[i]), sizeof(Character));
playersRead[i].display();
}

cFile.close();
}
else
{
cout << "Error opening file." << endl;
}


I've been working on this code for a few days and am really having trouble. I appreciate any help I can get, thanks in advance.






#pragma once
#include <iostream>
using std::ostream;
#include "string.h"
#include "coinPouch.h"
#include "backpack.h"

class Character
{
public:
Character();
Character(String name);
Character(String name, CoinPouch wallet, Backpack storage);
Character(const Character & copy);
~Character();
Character & operator =(const Character & rhs);

friend ostream & operator << (ostream & out, const Character & c);

void purchase(int p, int g, int s, int c);
void income(int p, int g, int s, int c);
void addPotion(const Potion & toAdd);
void checkBalance();
void checkBackpack();
void changeName(const String & newN);
void display();

String getName();
CoinPouch getWallet();
Backpack getStorage();
void setName(String name);
void setWallet(CoinPouch wallet);
void setStorage(Backpack storage);

private:
String m_name;
CoinPouch m_wallet;
Backpack m_storage;

};








#include "character.h"
using std::endl;
using std::cout;

Character::Character() : m_name("Player")
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name) : m_name(name)
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name, CoinPouch wallet, Backpack storage) : m_name(name), m_wallet(wallet), m_storage(storage)
{

}

Character::Character(const Character & copy) : m_name(copy.m_name), m_wallet(copy.m_wallet), m_storage(copy.m_storage)
{

}

Character::~Character()
{

}

Character & Character::operator =(const Character & rhs)
{
if (this != &rhs)
{
m_name = rhs.m_name;
m_wallet = rhs.m_wallet;
m_storage = rhs.m_storage;
}

return *this;
}

ostream & operator << (ostream & out, const Character & c)
{
out << c.m_name << ": " << endl;
out << c.m_wallet << endl;
out << c.m_storage << endl;

return out;
}

void Character::purchase(int p, int g, int s, int c)
{
m_wallet.buy(p, g, s, c);
}

void Character::income(int p, int g, int s, int c)
{
m_wallet.add(p, g, s, c);
}

void Character::addPotion(const Potion & toAdd)
{
m_storage.addPotion(toAdd);
}

void Character::checkBalance()
{
m_wallet.display();
}

void Character::checkBackpack()
{
m_storage.displayContents();
}

void Character::changeName(const String & newN)
{
m_name = newN;
}

void Character::display()
{
cout << m_name << ": " << endl;
m_wallet.display();
m_storage.displayContents();
}

String Character::getName()
{
return m_name;
}

CoinPouch Character::getWallet()
{
return m_wallet;
}

Backpack Character::getStorage()
{
return m_storage;
}

void Character::setName(String name)
{
m_name = name;
}

void Character::setWallet(CoinPouch wallet)
{
m_wallet = wallet;
}

void Character::setStorage(Backpack storage)
{
m_storage = storage;
}








#pragma once
#include <iostream>
using std::ostream;
#include "string.h"

class CoinPouch
{
public:
CoinPouch();
CoinPouch(String init);
CoinPouch(int p, int g, int s, int c);
CoinPouch(const CoinPouch & copy);
~CoinPouch();
CoinPouch & operator = (const CoinPouch & rhs);
friend ostream & operator << (ostream & out, const CoinPouch & c);

void add(int p, int g, int s, int c);
bool checkCost(int p, int g, int s, int c);
void buy(int p, int g, int s, int c);
void convertCost();
void roundUp();
void display();

int getP();
int getG();
int getS();
int getC();

private:
String m_amount;

int m_platinum;
int m_gold;
int m_silver;
int m_copper;
};








#pragma once
#include "potions.h"

class DynamicArray
{
public:
// Constructors
DynamicArray();
~DynamicArray();
DynamicArray(const DynamicArray & copy);

// Op Equals
DynamicArray & operator =(const DynamicArray & rhs);

// Insert, delete, and get elements functions
int getElements();
void Insert(const Potion & add);
void Delete(const Potion & rmv);
void display();

// Overloaded operators
Potion & operator (int index);
friend ostream & operator << (ostream & out, const DynamicArray & d);

private:
// Member variables
Potion * m_array;
int m_elements;

// Find function
int Find(const Potion & target);
};








#pragma once
#include "string.h"
#include <iostream>
using std::ostream;

class Potion
{
public:
// Constructors
Potion();
Potion(String name, String description, String potency, String cost);
Potion & operator = (const Potion & rhs);
Potion(const Potion & copy);

// Desctructor
~Potion();

// Overloaded operators
bool operator == (const Potion & rhs) const;
friend ostream & operator << (ostream & out, const Potion & p);

// Getter functions
String getName();
String getDesc();
String getPotency();
String getCost();
int getP();
int getG();
int getS();
int getC();

// Setter functions
void setName(String name);
void setDesc(String desc);
void setPotency(String potency);
void setCost(String cost);

// Convert and display functions
void convertCost();
void display();

private:
// Strings to hold item information
String m_name;
String m_description;
String m_potency;
String m_cost;

// Ints to hold cost information
int m_platinum;
int m_gold;
int m_silver;
int m_copper;

// Logical test
bool m_isnull = false;
};








#pragma once
#include <iostream>
using std::ostream;

class String
{
public:
// Constructors
String();
String(char ch);
String(const char * str);

// Destructor
~String();

// Copy Constructor and Copy Assignment Constructor
String(const String & copy);
String & operator=(const String & rhs);
friend ostream & operator << (ostream & out, const String & s);

// Added Functionality
void display();
void upper();
void lower();

// Operator Conversion
operator char *();
operator const char *();

// Overloaded operator
bool operator == (const String & rhs) const;

private:
// Member variables
char * m_str;
int m_ischar;

};








#pragma once
#include "dynamicarray.h"
#include "coinPouch.h"
#include "string.h"

class Backpack
{
public:
Backpack();
Backpack(DynamicArray potions);
Backpack(const Backpack & copy);
~Backpack();
Backpack & operator = (const Backpack & rhs);
friend ostream & operator << (ostream & out, const Backpack & c);

void addPotion(const Potion & add);
void usePotion(const Potion & rm);
void displayContents();

private:
DynamicArray m_potions;

int m_number;
};





This is a school project, and I am supposed to write the Character class to a binary file in order to save the characters so I can load them in on the program start. Right now I'm just trying to make sure that they can be successfully written to and read from the binary file and I have had no luck.



My bad, didn't know what to post and I didn't want to post everything in my file. Here is the character class. Let me know what else is needed, if anything.










share|improve this question




















  • 2





    It is logically impossible to determine if this "looks correct", because the shown code fails to meet all requirements of a Minimal, Complete, and Verifiable example, as explained in stackoverflow.com's help center. The best help anyone can give you is to advise you to read stackoverflow.com's help center, take a tour of stackoverflow.com and edit your question to include a Minimal, Complete, and Verifiable example.

    – Sam Varshavchik
    Nov 24 '18 at 2:14






  • 2





    Please post Character. None of this "binary file" stuff works if Character is a non-POD type.

    – PaulMcKenzie
    Nov 24 '18 at 2:17








  • 1





    In case it's not clear what a POD is... What Are POD Types in C++

    – Dave Newman
    Nov 24 '18 at 2:19













  • Please post Character.h. It is the members of Character that needs to be looked at, not the function implementations.

    – PaulMcKenzie
    Nov 24 '18 at 2:55













  • Now what is String? What is CoinPouch? What is BackPack? From the looks of it, none of your code will work for "binary reading or writing". Is this a school assignment? If you were not told what the requirements were to do things like cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character)), then you wound up wasting your time.

    – PaulMcKenzie
    Nov 24 '18 at 3:00
















-1












-1








-1








I'm working on a project where I have to write a class that contains three other classes as private member variables to a binary file, where it can then be read back into variables to be used in the code. The code writes to the file, but I don't know if it is writing the correct info as when I try to read the file it reads in junk. I have included my current setup, does this look correct? If so, what could be going wrong, and if not, how can I fix this?



If you need me to add any extra code, please ask. Another consideration is that two of the classes being used as member functions for the players objects inherit from other classes.



    if (cFile.is_open())
{
cFile.seekp(ios::beg);
for (int i = 0; i < 3; i++)
{
cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character));
}

cFile.seekg(ios::beg);
for (int i = 0; i < 3; i++)
{
cFile.read(reinterpret_cast<char *>(&playersRead[i]), sizeof(Character));
playersRead[i].display();
}

cFile.close();
}
else
{
cout << "Error opening file." << endl;
}


I've been working on this code for a few days and am really having trouble. I appreciate any help I can get, thanks in advance.






#pragma once
#include <iostream>
using std::ostream;
#include "string.h"
#include "coinPouch.h"
#include "backpack.h"

class Character
{
public:
Character();
Character(String name);
Character(String name, CoinPouch wallet, Backpack storage);
Character(const Character & copy);
~Character();
Character & operator =(const Character & rhs);

friend ostream & operator << (ostream & out, const Character & c);

void purchase(int p, int g, int s, int c);
void income(int p, int g, int s, int c);
void addPotion(const Potion & toAdd);
void checkBalance();
void checkBackpack();
void changeName(const String & newN);
void display();

String getName();
CoinPouch getWallet();
Backpack getStorage();
void setName(String name);
void setWallet(CoinPouch wallet);
void setStorage(Backpack storage);

private:
String m_name;
CoinPouch m_wallet;
Backpack m_storage;

};








#include "character.h"
using std::endl;
using std::cout;

Character::Character() : m_name("Player")
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name) : m_name(name)
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name, CoinPouch wallet, Backpack storage) : m_name(name), m_wallet(wallet), m_storage(storage)
{

}

Character::Character(const Character & copy) : m_name(copy.m_name), m_wallet(copy.m_wallet), m_storage(copy.m_storage)
{

}

Character::~Character()
{

}

Character & Character::operator =(const Character & rhs)
{
if (this != &rhs)
{
m_name = rhs.m_name;
m_wallet = rhs.m_wallet;
m_storage = rhs.m_storage;
}

return *this;
}

ostream & operator << (ostream & out, const Character & c)
{
out << c.m_name << ": " << endl;
out << c.m_wallet << endl;
out << c.m_storage << endl;

return out;
}

void Character::purchase(int p, int g, int s, int c)
{
m_wallet.buy(p, g, s, c);
}

void Character::income(int p, int g, int s, int c)
{
m_wallet.add(p, g, s, c);
}

void Character::addPotion(const Potion & toAdd)
{
m_storage.addPotion(toAdd);
}

void Character::checkBalance()
{
m_wallet.display();
}

void Character::checkBackpack()
{
m_storage.displayContents();
}

void Character::changeName(const String & newN)
{
m_name = newN;
}

void Character::display()
{
cout << m_name << ": " << endl;
m_wallet.display();
m_storage.displayContents();
}

String Character::getName()
{
return m_name;
}

CoinPouch Character::getWallet()
{
return m_wallet;
}

Backpack Character::getStorage()
{
return m_storage;
}

void Character::setName(String name)
{
m_name = name;
}

void Character::setWallet(CoinPouch wallet)
{
m_wallet = wallet;
}

void Character::setStorage(Backpack storage)
{
m_storage = storage;
}








#pragma once
#include <iostream>
using std::ostream;
#include "string.h"

class CoinPouch
{
public:
CoinPouch();
CoinPouch(String init);
CoinPouch(int p, int g, int s, int c);
CoinPouch(const CoinPouch & copy);
~CoinPouch();
CoinPouch & operator = (const CoinPouch & rhs);
friend ostream & operator << (ostream & out, const CoinPouch & c);

void add(int p, int g, int s, int c);
bool checkCost(int p, int g, int s, int c);
void buy(int p, int g, int s, int c);
void convertCost();
void roundUp();
void display();

int getP();
int getG();
int getS();
int getC();

private:
String m_amount;

int m_platinum;
int m_gold;
int m_silver;
int m_copper;
};








#pragma once
#include "potions.h"

class DynamicArray
{
public:
// Constructors
DynamicArray();
~DynamicArray();
DynamicArray(const DynamicArray & copy);

// Op Equals
DynamicArray & operator =(const DynamicArray & rhs);

// Insert, delete, and get elements functions
int getElements();
void Insert(const Potion & add);
void Delete(const Potion & rmv);
void display();

// Overloaded operators
Potion & operator (int index);
friend ostream & operator << (ostream & out, const DynamicArray & d);

private:
// Member variables
Potion * m_array;
int m_elements;

// Find function
int Find(const Potion & target);
};








#pragma once
#include "string.h"
#include <iostream>
using std::ostream;

class Potion
{
public:
// Constructors
Potion();
Potion(String name, String description, String potency, String cost);
Potion & operator = (const Potion & rhs);
Potion(const Potion & copy);

// Desctructor
~Potion();

// Overloaded operators
bool operator == (const Potion & rhs) const;
friend ostream & operator << (ostream & out, const Potion & p);

// Getter functions
String getName();
String getDesc();
String getPotency();
String getCost();
int getP();
int getG();
int getS();
int getC();

// Setter functions
void setName(String name);
void setDesc(String desc);
void setPotency(String potency);
void setCost(String cost);

// Convert and display functions
void convertCost();
void display();

private:
// Strings to hold item information
String m_name;
String m_description;
String m_potency;
String m_cost;

// Ints to hold cost information
int m_platinum;
int m_gold;
int m_silver;
int m_copper;

// Logical test
bool m_isnull = false;
};








#pragma once
#include <iostream>
using std::ostream;

class String
{
public:
// Constructors
String();
String(char ch);
String(const char * str);

// Destructor
~String();

// Copy Constructor and Copy Assignment Constructor
String(const String & copy);
String & operator=(const String & rhs);
friend ostream & operator << (ostream & out, const String & s);

// Added Functionality
void display();
void upper();
void lower();

// Operator Conversion
operator char *();
operator const char *();

// Overloaded operator
bool operator == (const String & rhs) const;

private:
// Member variables
char * m_str;
int m_ischar;

};








#pragma once
#include "dynamicarray.h"
#include "coinPouch.h"
#include "string.h"

class Backpack
{
public:
Backpack();
Backpack(DynamicArray potions);
Backpack(const Backpack & copy);
~Backpack();
Backpack & operator = (const Backpack & rhs);
friend ostream & operator << (ostream & out, const Backpack & c);

void addPotion(const Potion & add);
void usePotion(const Potion & rm);
void displayContents();

private:
DynamicArray m_potions;

int m_number;
};





This is a school project, and I am supposed to write the Character class to a binary file in order to save the characters so I can load them in on the program start. Right now I'm just trying to make sure that they can be successfully written to and read from the binary file and I have had no luck.



My bad, didn't know what to post and I didn't want to post everything in my file. Here is the character class. Let me know what else is needed, if anything.










share|improve this question
















I'm working on a project where I have to write a class that contains three other classes as private member variables to a binary file, where it can then be read back into variables to be used in the code. The code writes to the file, but I don't know if it is writing the correct info as when I try to read the file it reads in junk. I have included my current setup, does this look correct? If so, what could be going wrong, and if not, how can I fix this?



If you need me to add any extra code, please ask. Another consideration is that two of the classes being used as member functions for the players objects inherit from other classes.



    if (cFile.is_open())
{
cFile.seekp(ios::beg);
for (int i = 0; i < 3; i++)
{
cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character));
}

cFile.seekg(ios::beg);
for (int i = 0; i < 3; i++)
{
cFile.read(reinterpret_cast<char *>(&playersRead[i]), sizeof(Character));
playersRead[i].display();
}

cFile.close();
}
else
{
cout << "Error opening file." << endl;
}


I've been working on this code for a few days and am really having trouble. I appreciate any help I can get, thanks in advance.






#pragma once
#include <iostream>
using std::ostream;
#include "string.h"
#include "coinPouch.h"
#include "backpack.h"

class Character
{
public:
Character();
Character(String name);
Character(String name, CoinPouch wallet, Backpack storage);
Character(const Character & copy);
~Character();
Character & operator =(const Character & rhs);

friend ostream & operator << (ostream & out, const Character & c);

void purchase(int p, int g, int s, int c);
void income(int p, int g, int s, int c);
void addPotion(const Potion & toAdd);
void checkBalance();
void checkBackpack();
void changeName(const String & newN);
void display();

String getName();
CoinPouch getWallet();
Backpack getStorage();
void setName(String name);
void setWallet(CoinPouch wallet);
void setStorage(Backpack storage);

private:
String m_name;
CoinPouch m_wallet;
Backpack m_storage;

};








#include "character.h"
using std::endl;
using std::cout;

Character::Character() : m_name("Player")
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name) : m_name(name)
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name, CoinPouch wallet, Backpack storage) : m_name(name), m_wallet(wallet), m_storage(storage)
{

}

Character::Character(const Character & copy) : m_name(copy.m_name), m_wallet(copy.m_wallet), m_storage(copy.m_storage)
{

}

Character::~Character()
{

}

Character & Character::operator =(const Character & rhs)
{
if (this != &rhs)
{
m_name = rhs.m_name;
m_wallet = rhs.m_wallet;
m_storage = rhs.m_storage;
}

return *this;
}

ostream & operator << (ostream & out, const Character & c)
{
out << c.m_name << ": " << endl;
out << c.m_wallet << endl;
out << c.m_storage << endl;

return out;
}

void Character::purchase(int p, int g, int s, int c)
{
m_wallet.buy(p, g, s, c);
}

void Character::income(int p, int g, int s, int c)
{
m_wallet.add(p, g, s, c);
}

void Character::addPotion(const Potion & toAdd)
{
m_storage.addPotion(toAdd);
}

void Character::checkBalance()
{
m_wallet.display();
}

void Character::checkBackpack()
{
m_storage.displayContents();
}

void Character::changeName(const String & newN)
{
m_name = newN;
}

void Character::display()
{
cout << m_name << ": " << endl;
m_wallet.display();
m_storage.displayContents();
}

String Character::getName()
{
return m_name;
}

CoinPouch Character::getWallet()
{
return m_wallet;
}

Backpack Character::getStorage()
{
return m_storage;
}

void Character::setName(String name)
{
m_name = name;
}

void Character::setWallet(CoinPouch wallet)
{
m_wallet = wallet;
}

void Character::setStorage(Backpack storage)
{
m_storage = storage;
}








#pragma once
#include <iostream>
using std::ostream;
#include "string.h"

class CoinPouch
{
public:
CoinPouch();
CoinPouch(String init);
CoinPouch(int p, int g, int s, int c);
CoinPouch(const CoinPouch & copy);
~CoinPouch();
CoinPouch & operator = (const CoinPouch & rhs);
friend ostream & operator << (ostream & out, const CoinPouch & c);

void add(int p, int g, int s, int c);
bool checkCost(int p, int g, int s, int c);
void buy(int p, int g, int s, int c);
void convertCost();
void roundUp();
void display();

int getP();
int getG();
int getS();
int getC();

private:
String m_amount;

int m_platinum;
int m_gold;
int m_silver;
int m_copper;
};








#pragma once
#include "potions.h"

class DynamicArray
{
public:
// Constructors
DynamicArray();
~DynamicArray();
DynamicArray(const DynamicArray & copy);

// Op Equals
DynamicArray & operator =(const DynamicArray & rhs);

// Insert, delete, and get elements functions
int getElements();
void Insert(const Potion & add);
void Delete(const Potion & rmv);
void display();

// Overloaded operators
Potion & operator (int index);
friend ostream & operator << (ostream & out, const DynamicArray & d);

private:
// Member variables
Potion * m_array;
int m_elements;

// Find function
int Find(const Potion & target);
};








#pragma once
#include "string.h"
#include <iostream>
using std::ostream;

class Potion
{
public:
// Constructors
Potion();
Potion(String name, String description, String potency, String cost);
Potion & operator = (const Potion & rhs);
Potion(const Potion & copy);

// Desctructor
~Potion();

// Overloaded operators
bool operator == (const Potion & rhs) const;
friend ostream & operator << (ostream & out, const Potion & p);

// Getter functions
String getName();
String getDesc();
String getPotency();
String getCost();
int getP();
int getG();
int getS();
int getC();

// Setter functions
void setName(String name);
void setDesc(String desc);
void setPotency(String potency);
void setCost(String cost);

// Convert and display functions
void convertCost();
void display();

private:
// Strings to hold item information
String m_name;
String m_description;
String m_potency;
String m_cost;

// Ints to hold cost information
int m_platinum;
int m_gold;
int m_silver;
int m_copper;

// Logical test
bool m_isnull = false;
};








#pragma once
#include <iostream>
using std::ostream;

class String
{
public:
// Constructors
String();
String(char ch);
String(const char * str);

// Destructor
~String();

// Copy Constructor and Copy Assignment Constructor
String(const String & copy);
String & operator=(const String & rhs);
friend ostream & operator << (ostream & out, const String & s);

// Added Functionality
void display();
void upper();
void lower();

// Operator Conversion
operator char *();
operator const char *();

// Overloaded operator
bool operator == (const String & rhs) const;

private:
// Member variables
char * m_str;
int m_ischar;

};








#pragma once
#include "dynamicarray.h"
#include "coinPouch.h"
#include "string.h"

class Backpack
{
public:
Backpack();
Backpack(DynamicArray potions);
Backpack(const Backpack & copy);
~Backpack();
Backpack & operator = (const Backpack & rhs);
friend ostream & operator << (ostream & out, const Backpack & c);

void addPotion(const Potion & add);
void usePotion(const Potion & rm);
void displayContents();

private:
DynamicArray m_potions;

int m_number;
};





This is a school project, and I am supposed to write the Character class to a binary file in order to save the characters so I can load them in on the program start. Right now I'm just trying to make sure that they can be successfully written to and read from the binary file and I have had no luck.



My bad, didn't know what to post and I didn't want to post everything in my file. Here is the character class. Let me know what else is needed, if anything.






#pragma once
#include <iostream>
using std::ostream;
#include "string.h"
#include "coinPouch.h"
#include "backpack.h"

class Character
{
public:
Character();
Character(String name);
Character(String name, CoinPouch wallet, Backpack storage);
Character(const Character & copy);
~Character();
Character & operator =(const Character & rhs);

friend ostream & operator << (ostream & out, const Character & c);

void purchase(int p, int g, int s, int c);
void income(int p, int g, int s, int c);
void addPotion(const Potion & toAdd);
void checkBalance();
void checkBackpack();
void changeName(const String & newN);
void display();

String getName();
CoinPouch getWallet();
Backpack getStorage();
void setName(String name);
void setWallet(CoinPouch wallet);
void setStorage(Backpack storage);

private:
String m_name;
CoinPouch m_wallet;
Backpack m_storage;

};





#pragma once
#include <iostream>
using std::ostream;
#include "string.h"
#include "coinPouch.h"
#include "backpack.h"

class Character
{
public:
Character();
Character(String name);
Character(String name, CoinPouch wallet, Backpack storage);
Character(const Character & copy);
~Character();
Character & operator =(const Character & rhs);

friend ostream & operator << (ostream & out, const Character & c);

void purchase(int p, int g, int s, int c);
void income(int p, int g, int s, int c);
void addPotion(const Potion & toAdd);
void checkBalance();
void checkBackpack();
void changeName(const String & newN);
void display();

String getName();
CoinPouch getWallet();
Backpack getStorage();
void setName(String name);
void setWallet(CoinPouch wallet);
void setStorage(Backpack storage);

private:
String m_name;
CoinPouch m_wallet;
Backpack m_storage;

};





#include "character.h"
using std::endl;
using std::cout;

Character::Character() : m_name("Player")
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name) : m_name(name)
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name, CoinPouch wallet, Backpack storage) : m_name(name), m_wallet(wallet), m_storage(storage)
{

}

Character::Character(const Character & copy) : m_name(copy.m_name), m_wallet(copy.m_wallet), m_storage(copy.m_storage)
{

}

Character::~Character()
{

}

Character & Character::operator =(const Character & rhs)
{
if (this != &rhs)
{
m_name = rhs.m_name;
m_wallet = rhs.m_wallet;
m_storage = rhs.m_storage;
}

return *this;
}

ostream & operator << (ostream & out, const Character & c)
{
out << c.m_name << ": " << endl;
out << c.m_wallet << endl;
out << c.m_storage << endl;

return out;
}

void Character::purchase(int p, int g, int s, int c)
{
m_wallet.buy(p, g, s, c);
}

void Character::income(int p, int g, int s, int c)
{
m_wallet.add(p, g, s, c);
}

void Character::addPotion(const Potion & toAdd)
{
m_storage.addPotion(toAdd);
}

void Character::checkBalance()
{
m_wallet.display();
}

void Character::checkBackpack()
{
m_storage.displayContents();
}

void Character::changeName(const String & newN)
{
m_name = newN;
}

void Character::display()
{
cout << m_name << ": " << endl;
m_wallet.display();
m_storage.displayContents();
}

String Character::getName()
{
return m_name;
}

CoinPouch Character::getWallet()
{
return m_wallet;
}

Backpack Character::getStorage()
{
return m_storage;
}

void Character::setName(String name)
{
m_name = name;
}

void Character::setWallet(CoinPouch wallet)
{
m_wallet = wallet;
}

void Character::setStorage(Backpack storage)
{
m_storage = storage;
}





#include "character.h"
using std::endl;
using std::cout;

Character::Character() : m_name("Player")
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name) : m_name(name)
{
CoinPouch initialW;
Backpack initialS;
m_wallet = initialW;
m_storage = initialS;
}

Character::Character(String name, CoinPouch wallet, Backpack storage) : m_name(name), m_wallet(wallet), m_storage(storage)
{

}

Character::Character(const Character & copy) : m_name(copy.m_name), m_wallet(copy.m_wallet), m_storage(copy.m_storage)
{

}

Character::~Character()
{

}

Character & Character::operator =(const Character & rhs)
{
if (this != &rhs)
{
m_name = rhs.m_name;
m_wallet = rhs.m_wallet;
m_storage = rhs.m_storage;
}

return *this;
}

ostream & operator << (ostream & out, const Character & c)
{
out << c.m_name << ": " << endl;
out << c.m_wallet << endl;
out << c.m_storage << endl;

return out;
}

void Character::purchase(int p, int g, int s, int c)
{
m_wallet.buy(p, g, s, c);
}

void Character::income(int p, int g, int s, int c)
{
m_wallet.add(p, g, s, c);
}

void Character::addPotion(const Potion & toAdd)
{
m_storage.addPotion(toAdd);
}

void Character::checkBalance()
{
m_wallet.display();
}

void Character::checkBackpack()
{
m_storage.displayContents();
}

void Character::changeName(const String & newN)
{
m_name = newN;
}

void Character::display()
{
cout << m_name << ": " << endl;
m_wallet.display();
m_storage.displayContents();
}

String Character::getName()
{
return m_name;
}

CoinPouch Character::getWallet()
{
return m_wallet;
}

Backpack Character::getStorage()
{
return m_storage;
}

void Character::setName(String name)
{
m_name = name;
}

void Character::setWallet(CoinPouch wallet)
{
m_wallet = wallet;
}

void Character::setStorage(Backpack storage)
{
m_storage = storage;
}





#pragma once
#include <iostream>
using std::ostream;
#include "string.h"

class CoinPouch
{
public:
CoinPouch();
CoinPouch(String init);
CoinPouch(int p, int g, int s, int c);
CoinPouch(const CoinPouch & copy);
~CoinPouch();
CoinPouch & operator = (const CoinPouch & rhs);
friend ostream & operator << (ostream & out, const CoinPouch & c);

void add(int p, int g, int s, int c);
bool checkCost(int p, int g, int s, int c);
void buy(int p, int g, int s, int c);
void convertCost();
void roundUp();
void display();

int getP();
int getG();
int getS();
int getC();

private:
String m_amount;

int m_platinum;
int m_gold;
int m_silver;
int m_copper;
};





#pragma once
#include <iostream>
using std::ostream;
#include "string.h"

class CoinPouch
{
public:
CoinPouch();
CoinPouch(String init);
CoinPouch(int p, int g, int s, int c);
CoinPouch(const CoinPouch & copy);
~CoinPouch();
CoinPouch & operator = (const CoinPouch & rhs);
friend ostream & operator << (ostream & out, const CoinPouch & c);

void add(int p, int g, int s, int c);
bool checkCost(int p, int g, int s, int c);
void buy(int p, int g, int s, int c);
void convertCost();
void roundUp();
void display();

int getP();
int getG();
int getS();
int getC();

private:
String m_amount;

int m_platinum;
int m_gold;
int m_silver;
int m_copper;
};





#pragma once
#include "potions.h"

class DynamicArray
{
public:
// Constructors
DynamicArray();
~DynamicArray();
DynamicArray(const DynamicArray & copy);

// Op Equals
DynamicArray & operator =(const DynamicArray & rhs);

// Insert, delete, and get elements functions
int getElements();
void Insert(const Potion & add);
void Delete(const Potion & rmv);
void display();

// Overloaded operators
Potion & operator (int index);
friend ostream & operator << (ostream & out, const DynamicArray & d);

private:
// Member variables
Potion * m_array;
int m_elements;

// Find function
int Find(const Potion & target);
};





#pragma once
#include "potions.h"

class DynamicArray
{
public:
// Constructors
DynamicArray();
~DynamicArray();
DynamicArray(const DynamicArray & copy);

// Op Equals
DynamicArray & operator =(const DynamicArray & rhs);

// Insert, delete, and get elements functions
int getElements();
void Insert(const Potion & add);
void Delete(const Potion & rmv);
void display();

// Overloaded operators
Potion & operator (int index);
friend ostream & operator << (ostream & out, const DynamicArray & d);

private:
// Member variables
Potion * m_array;
int m_elements;

// Find function
int Find(const Potion & target);
};





#pragma once
#include "string.h"
#include <iostream>
using std::ostream;

class Potion
{
public:
// Constructors
Potion();
Potion(String name, String description, String potency, String cost);
Potion & operator = (const Potion & rhs);
Potion(const Potion & copy);

// Desctructor
~Potion();

// Overloaded operators
bool operator == (const Potion & rhs) const;
friend ostream & operator << (ostream & out, const Potion & p);

// Getter functions
String getName();
String getDesc();
String getPotency();
String getCost();
int getP();
int getG();
int getS();
int getC();

// Setter functions
void setName(String name);
void setDesc(String desc);
void setPotency(String potency);
void setCost(String cost);

// Convert and display functions
void convertCost();
void display();

private:
// Strings to hold item information
String m_name;
String m_description;
String m_potency;
String m_cost;

// Ints to hold cost information
int m_platinum;
int m_gold;
int m_silver;
int m_copper;

// Logical test
bool m_isnull = false;
};





#pragma once
#include "string.h"
#include <iostream>
using std::ostream;

class Potion
{
public:
// Constructors
Potion();
Potion(String name, String description, String potency, String cost);
Potion & operator = (const Potion & rhs);
Potion(const Potion & copy);

// Desctructor
~Potion();

// Overloaded operators
bool operator == (const Potion & rhs) const;
friend ostream & operator << (ostream & out, const Potion & p);

// Getter functions
String getName();
String getDesc();
String getPotency();
String getCost();
int getP();
int getG();
int getS();
int getC();

// Setter functions
void setName(String name);
void setDesc(String desc);
void setPotency(String potency);
void setCost(String cost);

// Convert and display functions
void convertCost();
void display();

private:
// Strings to hold item information
String m_name;
String m_description;
String m_potency;
String m_cost;

// Ints to hold cost information
int m_platinum;
int m_gold;
int m_silver;
int m_copper;

// Logical test
bool m_isnull = false;
};





#pragma once
#include <iostream>
using std::ostream;

class String
{
public:
// Constructors
String();
String(char ch);
String(const char * str);

// Destructor
~String();

// Copy Constructor and Copy Assignment Constructor
String(const String & copy);
String & operator=(const String & rhs);
friend ostream & operator << (ostream & out, const String & s);

// Added Functionality
void display();
void upper();
void lower();

// Operator Conversion
operator char *();
operator const char *();

// Overloaded operator
bool operator == (const String & rhs) const;

private:
// Member variables
char * m_str;
int m_ischar;

};





#pragma once
#include <iostream>
using std::ostream;

class String
{
public:
// Constructors
String();
String(char ch);
String(const char * str);

// Destructor
~String();

// Copy Constructor and Copy Assignment Constructor
String(const String & copy);
String & operator=(const String & rhs);
friend ostream & operator << (ostream & out, const String & s);

// Added Functionality
void display();
void upper();
void lower();

// Operator Conversion
operator char *();
operator const char *();

// Overloaded operator
bool operator == (const String & rhs) const;

private:
// Member variables
char * m_str;
int m_ischar;

};





#pragma once
#include "dynamicarray.h"
#include "coinPouch.h"
#include "string.h"

class Backpack
{
public:
Backpack();
Backpack(DynamicArray potions);
Backpack(const Backpack & copy);
~Backpack();
Backpack & operator = (const Backpack & rhs);
friend ostream & operator << (ostream & out, const Backpack & c);

void addPotion(const Potion & add);
void usePotion(const Potion & rm);
void displayContents();

private:
DynamicArray m_potions;

int m_number;
};





#pragma once
#include "dynamicarray.h"
#include "coinPouch.h"
#include "string.h"

class Backpack
{
public:
Backpack();
Backpack(DynamicArray potions);
Backpack(const Backpack & copy);
~Backpack();
Backpack & operator = (const Backpack & rhs);
friend ostream & operator << (ostream & out, const Backpack & c);

void addPotion(const Potion & add);
void usePotion(const Potion & rm);
void displayContents();

private:
DynamicArray m_potions;

int m_number;
};






c++ file input io binary






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 24 '18 at 3:09







empoweredev

















asked Nov 24 '18 at 2:09









empoweredevempoweredev

157




157








  • 2





    It is logically impossible to determine if this "looks correct", because the shown code fails to meet all requirements of a Minimal, Complete, and Verifiable example, as explained in stackoverflow.com's help center. The best help anyone can give you is to advise you to read stackoverflow.com's help center, take a tour of stackoverflow.com and edit your question to include a Minimal, Complete, and Verifiable example.

    – Sam Varshavchik
    Nov 24 '18 at 2:14






  • 2





    Please post Character. None of this "binary file" stuff works if Character is a non-POD type.

    – PaulMcKenzie
    Nov 24 '18 at 2:17








  • 1





    In case it's not clear what a POD is... What Are POD Types in C++

    – Dave Newman
    Nov 24 '18 at 2:19













  • Please post Character.h. It is the members of Character that needs to be looked at, not the function implementations.

    – PaulMcKenzie
    Nov 24 '18 at 2:55













  • Now what is String? What is CoinPouch? What is BackPack? From the looks of it, none of your code will work for "binary reading or writing". Is this a school assignment? If you were not told what the requirements were to do things like cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character)), then you wound up wasting your time.

    – PaulMcKenzie
    Nov 24 '18 at 3:00
















  • 2





    It is logically impossible to determine if this "looks correct", because the shown code fails to meet all requirements of a Minimal, Complete, and Verifiable example, as explained in stackoverflow.com's help center. The best help anyone can give you is to advise you to read stackoverflow.com's help center, take a tour of stackoverflow.com and edit your question to include a Minimal, Complete, and Verifiable example.

    – Sam Varshavchik
    Nov 24 '18 at 2:14






  • 2





    Please post Character. None of this "binary file" stuff works if Character is a non-POD type.

    – PaulMcKenzie
    Nov 24 '18 at 2:17








  • 1





    In case it's not clear what a POD is... What Are POD Types in C++

    – Dave Newman
    Nov 24 '18 at 2:19













  • Please post Character.h. It is the members of Character that needs to be looked at, not the function implementations.

    – PaulMcKenzie
    Nov 24 '18 at 2:55













  • Now what is String? What is CoinPouch? What is BackPack? From the looks of it, none of your code will work for "binary reading or writing". Is this a school assignment? If you were not told what the requirements were to do things like cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character)), then you wound up wasting your time.

    – PaulMcKenzie
    Nov 24 '18 at 3:00










2




2





It is logically impossible to determine if this "looks correct", because the shown code fails to meet all requirements of a Minimal, Complete, and Verifiable example, as explained in stackoverflow.com's help center. The best help anyone can give you is to advise you to read stackoverflow.com's help center, take a tour of stackoverflow.com and edit your question to include a Minimal, Complete, and Verifiable example.

– Sam Varshavchik
Nov 24 '18 at 2:14





It is logically impossible to determine if this "looks correct", because the shown code fails to meet all requirements of a Minimal, Complete, and Verifiable example, as explained in stackoverflow.com's help center. The best help anyone can give you is to advise you to read stackoverflow.com's help center, take a tour of stackoverflow.com and edit your question to include a Minimal, Complete, and Verifiable example.

– Sam Varshavchik
Nov 24 '18 at 2:14




2




2





Please post Character. None of this "binary file" stuff works if Character is a non-POD type.

– PaulMcKenzie
Nov 24 '18 at 2:17







Please post Character. None of this "binary file" stuff works if Character is a non-POD type.

– PaulMcKenzie
Nov 24 '18 at 2:17






1




1





In case it's not clear what a POD is... What Are POD Types in C++

– Dave Newman
Nov 24 '18 at 2:19







In case it's not clear what a POD is... What Are POD Types in C++

– Dave Newman
Nov 24 '18 at 2:19















Please post Character.h. It is the members of Character that needs to be looked at, not the function implementations.

– PaulMcKenzie
Nov 24 '18 at 2:55







Please post Character.h. It is the members of Character that needs to be looked at, not the function implementations.

– PaulMcKenzie
Nov 24 '18 at 2:55















Now what is String? What is CoinPouch? What is BackPack? From the looks of it, none of your code will work for "binary reading or writing". Is this a school assignment? If you were not told what the requirements were to do things like cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character)), then you wound up wasting your time.

– PaulMcKenzie
Nov 24 '18 at 3:00







Now what is String? What is CoinPouch? What is BackPack? From the looks of it, none of your code will work for "binary reading or writing". Is this a school assignment? If you were not told what the requirements were to do things like cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character)), then you wound up wasting your time.

– PaulMcKenzie
Nov 24 '18 at 3:00














1 Answer
1






active

oldest

votes


















1














It should be immediately obvious that this code can't possibly work.



        cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character));


However big sizeof(Character) is, we could have a Character with an m_name that takes up more bytes than that. So this code can't possibly be writing the character's name, and it clearly needs to do that.



Before you write anything to a file, decide on (and ideally, document) a file format at the byte level. Make sure your code writes in the format you documented and also can read in the format you documented. Skipping this step leads to pain and it also makes debugging impossible because you can't look at the file and compare it to a specification to see whether the writer or the reader is at fault.



Had you documented what bytes the player's name will occupy in the file, you'd immediately realize that you either need to have a variable-length object and encode the length somehow or pick a largest size name and allocate those many bytes. But because you skipped that vital step, you never actually worked out how to write a Character to a file.






share|improve this answer
























  • Thanks, I feel dumb now. I should've known that the dynamic string would cause an issue. o_o

    – empoweredev
    Nov 26 '18 at 17:35











  • @empoweredev That's not really the issue though. The issue is that you didn't decide on a format. The string is just one way that happened to bite you. It could also be biting you in other ways.

    – David Schwartz
    Nov 27 '18 at 6:24











  • That was what I was forgetting. I have a file format set up now and have file I/O working smoothly, all I needed was to remember that dynamic memory would have to be treated differently than normal stuff when writing to files.

    – empoweredev
    Nov 27 '18 at 8:25











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53454617%2fhow-to-write-read-classes-within-classes-to-binary-file-c%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














It should be immediately obvious that this code can't possibly work.



        cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character));


However big sizeof(Character) is, we could have a Character with an m_name that takes up more bytes than that. So this code can't possibly be writing the character's name, and it clearly needs to do that.



Before you write anything to a file, decide on (and ideally, document) a file format at the byte level. Make sure your code writes in the format you documented and also can read in the format you documented. Skipping this step leads to pain and it also makes debugging impossible because you can't look at the file and compare it to a specification to see whether the writer or the reader is at fault.



Had you documented what bytes the player's name will occupy in the file, you'd immediately realize that you either need to have a variable-length object and encode the length somehow or pick a largest size name and allocate those many bytes. But because you skipped that vital step, you never actually worked out how to write a Character to a file.






share|improve this answer
























  • Thanks, I feel dumb now. I should've known that the dynamic string would cause an issue. o_o

    – empoweredev
    Nov 26 '18 at 17:35











  • @empoweredev That's not really the issue though. The issue is that you didn't decide on a format. The string is just one way that happened to bite you. It could also be biting you in other ways.

    – David Schwartz
    Nov 27 '18 at 6:24











  • That was what I was forgetting. I have a file format set up now and have file I/O working smoothly, all I needed was to remember that dynamic memory would have to be treated differently than normal stuff when writing to files.

    – empoweredev
    Nov 27 '18 at 8:25
















1














It should be immediately obvious that this code can't possibly work.



        cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character));


However big sizeof(Character) is, we could have a Character with an m_name that takes up more bytes than that. So this code can't possibly be writing the character's name, and it clearly needs to do that.



Before you write anything to a file, decide on (and ideally, document) a file format at the byte level. Make sure your code writes in the format you documented and also can read in the format you documented. Skipping this step leads to pain and it also makes debugging impossible because you can't look at the file and compare it to a specification to see whether the writer or the reader is at fault.



Had you documented what bytes the player's name will occupy in the file, you'd immediately realize that you either need to have a variable-length object and encode the length somehow or pick a largest size name and allocate those many bytes. But because you skipped that vital step, you never actually worked out how to write a Character to a file.






share|improve this answer
























  • Thanks, I feel dumb now. I should've known that the dynamic string would cause an issue. o_o

    – empoweredev
    Nov 26 '18 at 17:35











  • @empoweredev That's not really the issue though. The issue is that you didn't decide on a format. The string is just one way that happened to bite you. It could also be biting you in other ways.

    – David Schwartz
    Nov 27 '18 at 6:24











  • That was what I was forgetting. I have a file format set up now and have file I/O working smoothly, all I needed was to remember that dynamic memory would have to be treated differently than normal stuff when writing to files.

    – empoweredev
    Nov 27 '18 at 8:25














1












1








1







It should be immediately obvious that this code can't possibly work.



        cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character));


However big sizeof(Character) is, we could have a Character with an m_name that takes up more bytes than that. So this code can't possibly be writing the character's name, and it clearly needs to do that.



Before you write anything to a file, decide on (and ideally, document) a file format at the byte level. Make sure your code writes in the format you documented and also can read in the format you documented. Skipping this step leads to pain and it also makes debugging impossible because you can't look at the file and compare it to a specification to see whether the writer or the reader is at fault.



Had you documented what bytes the player's name will occupy in the file, you'd immediately realize that you either need to have a variable-length object and encode the length somehow or pick a largest size name and allocate those many bytes. But because you skipped that vital step, you never actually worked out how to write a Character to a file.






share|improve this answer













It should be immediately obvious that this code can't possibly work.



        cFile.write(reinterpret_cast<char *>(&players[i]), sizeof(Character));


However big sizeof(Character) is, we could have a Character with an m_name that takes up more bytes than that. So this code can't possibly be writing the character's name, and it clearly needs to do that.



Before you write anything to a file, decide on (and ideally, document) a file format at the byte level. Make sure your code writes in the format you documented and also can read in the format you documented. Skipping this step leads to pain and it also makes debugging impossible because you can't look at the file and compare it to a specification to see whether the writer or the reader is at fault.



Had you documented what bytes the player's name will occupy in the file, you'd immediately realize that you either need to have a variable-length object and encode the length somehow or pick a largest size name and allocate those many bytes. But because you skipped that vital step, you never actually worked out how to write a Character to a file.







share|improve this answer












share|improve this answer



share|improve this answer










answered Nov 24 '18 at 3:17









David SchwartzDavid Schwartz

136k14143224




136k14143224













  • Thanks, I feel dumb now. I should've known that the dynamic string would cause an issue. o_o

    – empoweredev
    Nov 26 '18 at 17:35











  • @empoweredev That's not really the issue though. The issue is that you didn't decide on a format. The string is just one way that happened to bite you. It could also be biting you in other ways.

    – David Schwartz
    Nov 27 '18 at 6:24











  • That was what I was forgetting. I have a file format set up now and have file I/O working smoothly, all I needed was to remember that dynamic memory would have to be treated differently than normal stuff when writing to files.

    – empoweredev
    Nov 27 '18 at 8:25



















  • Thanks, I feel dumb now. I should've known that the dynamic string would cause an issue. o_o

    – empoweredev
    Nov 26 '18 at 17:35











  • @empoweredev That's not really the issue though. The issue is that you didn't decide on a format. The string is just one way that happened to bite you. It could also be biting you in other ways.

    – David Schwartz
    Nov 27 '18 at 6:24











  • That was what I was forgetting. I have a file format set up now and have file I/O working smoothly, all I needed was to remember that dynamic memory would have to be treated differently than normal stuff when writing to files.

    – empoweredev
    Nov 27 '18 at 8:25

















Thanks, I feel dumb now. I should've known that the dynamic string would cause an issue. o_o

– empoweredev
Nov 26 '18 at 17:35





Thanks, I feel dumb now. I should've known that the dynamic string would cause an issue. o_o

– empoweredev
Nov 26 '18 at 17:35













@empoweredev That's not really the issue though. The issue is that you didn't decide on a format. The string is just one way that happened to bite you. It could also be biting you in other ways.

– David Schwartz
Nov 27 '18 at 6:24





@empoweredev That's not really the issue though. The issue is that you didn't decide on a format. The string is just one way that happened to bite you. It could also be biting you in other ways.

– David Schwartz
Nov 27 '18 at 6:24













That was what I was forgetting. I have a file format set up now and have file I/O working smoothly, all I needed was to remember that dynamic memory would have to be treated differently than normal stuff when writing to files.

– empoweredev
Nov 27 '18 at 8:25





That was what I was forgetting. I have a file format set up now and have file I/O working smoothly, all I needed was to remember that dynamic memory would have to be treated differently than normal stuff when writing to files.

– empoweredev
Nov 27 '18 at 8:25


















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53454617%2fhow-to-write-read-classes-within-classes-to-binary-file-c%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Berounka

Fiat S.p.A.

Type 'String' is not a subtype of type 'int' of 'index'