Здравствуйте, Ravshan, Вы писали:
R> out.write((char*)&a, sizeof(address));
Убийца памяти!
Ты надеешься, что если запишешь побайтово указатель, а потом прочтёшь те же байты, то они будут указывать на то же самое содержимое?
R>Когда вывожу в первых двух полях которые string абракадабра, а в третьем, которое инт все нормально. Студия Visual Studio 6. Когда записываю и считываю в одном проекте все нормально. И в 2005 студии в разных все нормально работает. Но нужно сделать в 6 и в разных. Как?
Это связано с тем, что в какой-то из версий STL строка содержит внутри себя короткий буфер — это позволяет избежать лишних выделений памяти. А в другой не содержит!
Нужно сделать:
полноценную, а не халтурную функцию сериализации для класса address.
Представь себе, что считывать его будет не сишная программа, а вообще бейсиковая. Вот и обеспечь такой формат файла, который не зависит от языка.
В простейшем виде:
ostream& operator << (ostream& ost, address const& a)
{
ost << a.name << "\n"; // по одному полю на линию текста
ost << a.street << "\n";
ost << a.house << "\n";
return ost;
}
istream& operator >> (istream& ist, address& a)
{
getline(istr, a.name); // считываем линию целиком (обычный istr >> a.name считает до пробела)
getline(istr, a.street);
ist >> a.house;
return ist;
}
В навороченном — посмотри, например, boost::serialization
... << RSDN@Home 1.2.0 alpha rev. 655>>