Это нужно для обратной совместимости фалов различных версий. По переменной ident я определяю что дальше читать из архива.
В наличии уже много файлов старых версий и в них нужно добавлять новую информацию, но при этом суметь прочитать их в новой версии программы.
Структура сохранения сложная, поэтому здесь я ее описывать не буду. Это единственный способ, который я нашел, чтобы решить свою проблему более-менне красиво и не драматично. Если переменная ident, прочитанная из архива, не равняется какому-то числу, то ее нужно вернуть обратно в архив.
ОчевидноЮ что CArchive создается с флагами: CArchive:load или CArchive::store. Можно ли на ходу поменять режим, чтобы вернуть переменную обратно. Возможно есть какие-то другие методы решения.
Здравствуйте, Carc, Вы писали:
A>>Если переменная ident, прочитанная из архива, не равняется какому-то числу, то ее нужно вернуть обратно в архив. C>А зачем ее возвращать в архив?
В старых версия файлов переменной ident нет. Поэтому если переменная ident не равна определенному числу (0xFFFFFFFF, например) я считаю, что ее нет в читаемом файле, а считанная информация может являться частью переменной совсем другого типа и я ее возвращаю обратно для дальнейшего корректного чтения переменной уже другого типа.
Здравствуйте, ahaos, Вы писали:
A>Здравствуйте, Carc, Вы писали:
A>>>Если переменная ident, прочитанная из архива, не равняется какому-то числу, то ее нужно вернуть обратно в архив. C>>А зачем ее возвращать в архив?
A>В старых версия файлов переменной ident нет. Поэтому если переменная ident не равна определенному числу (0xFFFFFFFF, например) я считаю, что ее нет в читаемом файле, а считанная информация может являться частью переменной совсем другого типа и я ее возвращаю обратно для дальнейшего корректного чтения переменной уже другого типа.
"Возвращать обратно" CArchive не умеет. Но в принципе можно достучаться из CArchive до указателя CFile* и сдвинуть текущую позицию чтения назад на sizeof(ident). Но это все безусловно костыль, и лучше так не делать.
Создадим наследника от 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, например) я считаю, что ее нет в читаемом файле
Ты думаешь, что если ее нет (т.е. она не записывалась ранее), то ты ее оттуда и не прочитаешь? Боюсь ты просто прочитаешь какой-то мусор, переменные, которые записаны дальше.
A>Нужно подряд реализовать две команды.
A>int ident;
A>ar >> ident; A>ar << ident;
A>Это нужно для обратной совместимости фалов различных версий. По переменной ident я определяю что дальше читать из архива.
Посмотри CArchive::GetObjectSchema(), я уверен, что твоя проблема решается с ее помощью.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, ahaos, Вы писали:
A>В старых версия файлов переменной ident нет. Поэтому если переменная ident не равна определенному числу (0xFFFFFFFF, например) я считаю, что ее нет в читаемом файле, а считанная информация может являться частью переменной совсем другого типа и я ее возвращаю обратно для дальнейшего корректного чтения переменной уже другого типа.
Приятной отладки если там нет ident, но следующее число случайно равно 0xFFFFFFFF, например.