Re: Файловые потоки: read, write. Странные вещи происходят.
От: Кодт Россия  
Дата: 15.05.07 09:31
Оценка:
Здравствуйте, 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>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.