Запись классов в бинарный файл — как исправить ошибку?

Есть класс
class data
{
public:
        float N;
	float* ti;

	data()
        {
           N=0;
           ti = new float[1];
           ti[0]=0;
        }
	~data(void);
};


создаю элемент класса и записываю его в бинарный файл
count = 3;
        
	data d;
	d.N=count;
	d.ti=new float[count];

	for(int i=0;i<count;i++)
	{
		d.ti[i]= 5-i;
	}	

	ofstream out("C:\\1\\bd.dat",ios::binary|ios::out);
	out.write((char*)&d,sizeof d);
	out.close();


закрываю программу, открываю заново потом считываю
data s;
	ifstream in("C:\\1\\bd.dat",ios::binary|ios::in);
	in.read((char*)&s,sizeof s);
	in.close(); 
	
	for(int i=0;i<s.N;i++)
	{
		cout << "ti [ << i << "] = " << s.ti[i]; 
	}


При попытке вывести массив ti пишет ошибку (0xc0000005), как исправить?
  • Вопрос задан
  • 3249 просмотров
Решения вопроса 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
Прочитайте про указатели. Когда у меня только появился компьютер, я хотел поделиться игрой с другом и скопировал на дискету ярлычок с рабочего стола. Разумеется, эта идея была обречена на провал. Ваш код пытается сделать примерно то же самое. В бинарном представлении класса data есть одно поле float N которое успешно записывается в файл, и второе float *ti, которое является всего лишь адресом. После того как вы считываете данные из файла, он указывает на какое-то место в памяти где может быть что угодно, но не тот массив, который вы ожидаете увидеть.

А исправить можно например так. Данные для наглядности пишем в текстовый файл.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
kosmos89
@kosmos89
Записывать таким образом можно только POD типы. А указатель делает твой класс не-POD.
Хотя на самом деле даже POD структуры записывать так просто не получится, ибо у структур (и классов, само собой) есть такое понятие, как выравнивание полей. И это самое выравнивание может отличаться на разных платформах, у разных компиляторов, и даже один и тот же компилятор может менять выравнивание в зависимости от настроек. А можно еще вспомнить endianess.
Как вариант, глянь в сторону protobuf, там все эти проблемы уже решены.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы