Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: вопрос по AnsiString  (Прочитано 6032 раз)
0 Пользователей и 1 Гость смотрят эту тему.
locator
Постоялец

ru
Offline Offline

« : 27-04-2007 18:36 » 

В программе создается структура, в ней есть переменная типа AnsiString:
struct _DATA
{
//....
int x, y, z;
AnsiString s;
};
typedef struct _DATA DATA;
DATA d;

Заполняю структуру и сбрасываю ее в файл:
tfile=new TFileStream("_data.dat", fmOpenWrite);
tfile->Write((void*)&d, sizeof(d));
delete tfile;

Дальше другая программы пытается прочитать стурктуру из файла "_data.dat":
tfile->Read((void*)&d, sizeof(d));
В переменную d все нормально считывется, кроме строки s (совершенно
постороннее значение, не то, что было при записи в файл).
Почему так получается с типом AnsiString? Спасибо за ответ!

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


WWW
« Ответ #1 : 27-04-2007 18:53 » 

не нашёл описание AnsiString в МСНД...
скорее всего (по аналогии с CString , который, по сути, есть всего лишь указатель на область динамически выделенной памяти) сохраняется лишь упомянутый хендл (4 байта). Надо сохранять также массив отдельно, определив его длину и эту длину тож сохранить.
« Последнее редактирование: 27-04-2007 18:55 от Алексей1153++ » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 27-04-2007 19:02 » 

AnsiString является класом и соответственно его сериализацию ты должен производить в дополнение к сериализации структуры. А так у тебя только записывается значение указателя на экземпляр класса. И соответственно при считывании это будет тебе давать мусор только.
« Последнее редактирование: 27-04-2007 19:04 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
locator
Постоялец

ru
Offline Offline

« Ответ #3 : 02-05-2007 17:53 » 

AnsiString является класом и соответственно его сериализацию ты должен производить в дополнение к сериализации структуры. А так у тебя только записывается значение указателя на экземпляр класса. И соответственно при считывании это будет тебе давать мусор только.
написал char s[64] вместо AnsiString и все нормально!
Записан
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 03-05-2007 07:11 » 

locator, это естественно Улыбаюсь нельзя писать в файлы без каких преобразований не POD структуры. О причинах тебе расказали Finch и Алексей1153++

Я для запись классов и архивов в файл или в буфер для последующей передачи по сети
ипользую boost::serialize(о чем написано не однократно в том числе и мной) причем он позволяет делать сериализацию не только в бинарное представление, но и в текст и XML + контроль версий и еще что-то чем я не пользуюсь Улыбаюсь

очень полезная вещь Улыбаюсь и не надо изобретать велосипед

запись класса в файл(за исключением инициализации архива из двух строк) будет выглядеть вот так:

ar << MyClass;
чтение
ar >> MyClass;
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines