Zapis do pliku binarnego

0

Witam, mam pewien problem związany z zapisem do pliku binarnego stworzonej klasy.
Zapisuje ona do pliku wskaznik do tablicy a nie zawartość pcoord[1] oraz pcoord[0].
W dodatku na końcu pojawia się BLOCK_TYPE_IS_VALID.
Co zmienić aby do pliku zostały zapisane dwie liczby double (pcoord[0] i pcoord[1]

#include "stdafx.h"
#include <iostream>
#include <fstream>

using namespace std;

class my_coord
{
protected:
	double *pcoord;  //pcoord[0] -x ; pcoord[1] - y
	double x, y;
	//my_mess msg;
	void alloc();
public:
	void set(double x, double y) { pcoord[0] = x; pcoord[1] = y; }
	my_coord() { alloc(); pcoord[0] = pcoord[1] = 0; }
	my_coord(double x, double y);
	my_coord(const my_coord & ob);
	~my_coord();
	my_coord & operator = (const my_coord &ob);
	friend istream & operator >> (istream &strm, my_coord &ob);
	friend ostream & operator << (ostream &strm, const my_coord &ob);
	bool operator == (const my_coord & left) const;

};

my_coord & my_coord::operator = (const my_coord &ob)
{
	if (ob.pcoord)
	{
		if (!pcoord)
			alloc();
		pcoord[0] = ob.pcoord[0];
		pcoord[1] = ob.pcoord[1];
	}
	else
	{
		if (pcoord)
			delete[] pcoord;
		pcoord = NULL;
	}
	//msg = ob.msg;

	return *this;
}

istream & operator >> (istream &strm, my_coord &ob)
{
	cout << "x :";
	strm >> ob.pcoord[0];

	cout << "y :";
	strm >> ob.pcoord[1];
	return strm;
}

my_coord::my_coord(const my_coord & ob)
{
	alloc();
	pcoord[0] = ob.pcoord[0];
	pcoord[1] = ob.pcoord[1];
}

ostream & operator << (ostream &strm, const my_coord &ob)
{
	strm << ob.pcoord[0] << " " << ob.pcoord[1];
	return strm;
}

void my_coord::alloc()
{
	try
	{
		pcoord = new double[2];
	}
	catch (bad_alloc)
	{
//		msg.mess(my_mess::ERR_ALLOC_MEM);
	}
}

my_coord::my_coord(double x, double y)
{
	alloc();
	pcoord[0] = x;
	pcoord[1] = y;
}

my_coord::~my_coord()
{
	delete[] pcoord;
	pcoord = NULL;
}

bool my_coord::operator == (const my_coord & left) const
{
	return(pcoord[0] == left.pcoord[0] &&
		pcoord[1] == left.pcoord[1]);
}

int main()
{
	my_coord crd, temp;
	crd.set(12, 32);
	fstream plik;

	plik.open("test.bin", ios::out | ios::binary);

	plik.write(reinterpret_cast<char*>(&crd), static_cast<streamsize>(sizeof(my_coord)));

	plik.close();

	plik.open("test.bin", ios::in | ios::binary);
	
	plik.read(reinterpret_cast<char*>(&temp), static_cast<streamsize>(sizeof(my_coord)));
	cout << temp;

	plik.close();

	return 0;
} 
0
  1. Przydzielasz zawsze na dwa elementy - więc to się absolutnie nie opłaca, użyj tych x,y i już;
  2. Generalnie to nie jest dobry pomysł zapisywać klasy binarnie, co najwyżej struktury, bo klasa na początku może mieć różne dziwne rzeczy.
  3. Zawsze możesz do klasy dodać metodę void my_coord::write(ofstream &fout) { fout.write((char*)&x,sizeof(double)); fout.write((char*)&y,sizeof(double)); }
  4. Nie smaruj po ekranu w metodzie istream & operator >> (istream &strm, my_coord &ob) zrób ją dokładnie jak operator <<. Używasz: my_coord mc; cout<<"Podaj dwie liczby x y: "; cin>>mc;
0

Tak na prawdę, jest to fragment kodu większego projektu klasy template.
Mam w nim zapisać binarnie (jest to wymóg) m. in. tę klase.
Tak samo z dwoma elementami, wymogiem jest użycie wskaźnika (x, y odpada).

Może skorzystać z innej metody niż stream.write/read ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1