Вопрос по CArchive
От: ahaos  
Дата: 09.02.14 10:31
Оценка:
Нужно подряд реализовать две команды.

int ident;

ar >> ident;
ar << ident;

Это нужно для обратной совместимости фалов различных версий. По переменной ident я определяю что дальше читать из архива.
В наличии уже много файлов старых версий и в них нужно добавлять новую информацию, но при этом суметь прочитать их в новой версии программы.
Структура сохранения сложная, поэтому здесь я ее описывать не буду. Это единственный способ, который я нашел, чтобы решить свою проблему более-менне красиво и не драматично. Если переменная ident, прочитанная из архива, не равняется какому-то числу, то ее нужно вернуть обратно в архив.
ОчевидноЮ что CArchive создается с флагами: CArchive:load или CArchive::store. Можно ли на ходу поменять режим, чтобы вернуть переменную обратно. Возможно есть какие-то другие методы решения.
Re: Вопрос по CArchive
От: Carc Россия http://www.amlpages.com/home.php
Дата: 10.02.14 06:31
Оценка:
A>Если переменная ident, прочитанная из архива, не равняется какому-то числу, то ее нужно вернуть обратно в архив.
А зачем ее возвращать в архив?
Aml Pages Home
Re[2]: Вопрос по CArchive
От: ahaos  
Дата: 12.02.14 19:02
Оценка:
Здравствуйте, Carc, Вы писали:

A>>Если переменная ident, прочитанная из архива, не равняется какому-то числу, то ее нужно вернуть обратно в архив.

C>А зачем ее возвращать в архив?

В старых версия файлов переменной ident нет. Поэтому если переменная ident не равна определенному числу (0xFFFFFFFF, например) я считаю, что ее нет в читаемом файле, а считанная информация может являться частью переменной совсем другого типа и я ее возвращаю обратно для дальнейшего корректного чтения переменной уже другого типа.
Re[3]: Вопрос по CArchive
От: Carc Россия http://www.amlpages.com/home.php
Дата: 12.02.14 19:16
Оценка: +1
Здравствуйте, ahaos, Вы писали:

A>Здравствуйте, Carc, Вы писали:


A>>>Если переменная ident, прочитанная из архива, не равняется какому-то числу, то ее нужно вернуть обратно в архив.

C>>А зачем ее возвращать в архив?

A>В старых версия файлов переменной ident нет. Поэтому если переменная ident не равна определенному числу (0xFFFFFFFF, например) я считаю, что ее нет в читаемом файле, а считанная информация может являться частью переменной совсем другого типа и я ее возвращаю обратно для дальнейшего корректного чтения переменной уже другого типа.

"Возвращать обратно" CArchive не умеет. Но в принципе можно достучаться из CArchive до указателя CFile* и сдвинуть текущую позицию чтения назад на sizeof(ident). Но это все безусловно костыль, и лучше так не делать.
Aml Pages Home
Re: Вопрос по CArchive
От: Pavel Dvorkin Россия  
Дата: 15.02.14 07:06
Оценка:
Здравствуйте, ahaos, Вы писали:

Возможное, хотя не сильно изящное решение.

CArchive создается и уничтожается в

CDocument::OnOpenDocument

он там локальная переменная

Создадим наследника от CArchive, в нем обеспечим нужную функциональность (метод возврата назад — pushback)

Перекроем OnOpenDocument в своем классе документа , скопипастим туда код из CDocument::OnOpenDocument, заменим CArchive на CMyArchive

Теперь сможешь написать

ar >> ident;
ar.pushback(ident);
ar << ident;
With best regards
Pavel Dvorkin
Re[3]: Вопрос по CArchive
От: Аноним  
Дата: 05.03.14 07:50
Оценка:
Здравствуйте, ahaos, Вы писали:

C>>А зачем ее возвращать в архив?


A>В старых версия файлов переменной ident нет. Поэтому если переменная ident не равна определенному числу (0xFFFFFFFF, например) я считаю, что ее нет в читаемом файле


Ты думаешь, что если ее нет (т.е. она не записывалась ранее), то ты ее оттуда и не прочитаешь? Боюсь ты просто прочитаешь какой-то мусор, переменные, которые записаны дальше.
Re: Вопрос по CArchive
От: Stanislav V. Zudin Россия  
Дата: 05.03.14 08:35
Оценка:
Здравствуйте, ahaos, Вы писали:


A>Нужно подряд реализовать две команды.


A>int ident;


A>ar >> ident;

A>ar << ident;

A>Это нужно для обратной совместимости фалов различных версий. По переменной ident я определяю что дальше читать из архива.


Посмотри CArchive::GetObjectSchema(), я уверен, что твоя проблема решается с ее помощью.
_____________________
С уважением,
Stanislav V. Zudin
Re[3]: Вопрос по CArchive
От: VladFein США  
Дата: 07.03.14 19:52
Оценка:
Здравствуйте, ahaos, Вы писали:

A>В старых версия файлов переменной ident нет. Поэтому если переменная ident не равна определенному числу (0xFFFFFFFF, например) я считаю, что ее нет в читаемом файле, а считанная информация может являться частью переменной совсем другого типа и я ее возвращаю обратно для дальнейшего корректного чтения переменной уже другого типа.


Приятной отладки если там нет ident, но следующее число случайно равно 0xFFFFFFFF, например.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.