Когда вывожу в первых двух полях которые string абракадабра, а в третьем, которое инт все нормально. Студия Visual Studio 6. Когда записываю и считываю в одном проекте все нормально. И в 2005 студии в разных все нормально работает. Но нужно сделать в 6 и в разных. Как?
Здравствуйте, Ravshan, Вы писали:
R>Когда вывожу в первых двух полях которые string абракадабра,
Это std::string? Тогда все понятно. Абракадабра и должна быть
Здравствуйте, LuciferMoscow, Вы писали: LM>Это std::string? Тогда все понятно. Абракадабра и должна быть
Но 2005 работает, и в 6 когда в одном проекте работает. Как исправить-то?
Здравствуйте, Ravshan, Вы писали:
LM>>Это std::string? Тогда все понятно. Абракадабра и должна быть R>Но 2005 работает, и в 6 когда в одном проекте работает. Как исправить-то?
Значит тебе везло. Реализация std::string не определена в стандарте. Одна из возможных(сильно упрощенная и кастрированная)
class string
{
private:
char* buffer_;
size_t bufSize_;
public:
std::string(const char* initString)
{
bufSize_=strlen( initString )+1;
buffer_ = new char[ bufSize_ ];
strcpy( initString, buffer );
}
};
Что будет при твоем виде загрузки такой строки понимаешь?
P.S. То, что std::string — typedef для std::basic_string<......> ЗНАЮ. Просто усложнять не хотел
P.S.S. Как нарисовать тут простое и правильное решение- не знаю(есть желание послать автора темы к бустовой сериализации)
Убийца памяти!
Ты надеешься, что если запишешь побайтово указатель, а потом прочтёшь те же байты, то они будут указывать на то же самое содержимое?
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