2013-02-15 3 views
3

У меня есть такой файл:Обновление для файлов записей и обратной совместимости

file of record 
    Str: string[250]; 
    RecType: Cardinal; 
end; 

, но через некоторое время с помощью этого файла мой клиент нашел, что ул никогда не будет больше, чем 100 символов, а также он нуждается в дополнительных полей.

В новой версии у нас есть такой файл:

file of packed record 
    Str: string[200]; 
    Reserved: array[1..47] of Byte; 
    NewFiled: Cardinal; 
    RecType: Cardinal; 
end; 

Эта запись имеет одинаковый размер, в предыдущей записи между Str и RecType был один неиспользуемые байтами при выравнивании до 8 байт.

Вопрос: что произошло, когда этот новый файл будет считываться из старого кода? Ему нужна обратная совместимость.

Старый образец кода чтения:

var 
    FS: TFileStream; 
    Rec: record 
     Str: string[250]; 
     RecType: Cardinal; 
     end; 
... 
// reading record by record from file: 
FS.Read(Rec, SizeOf(Rec)); 
+0

Вам необходимо указать языковые теги на свои вопросы. Люди, которые не знакомы с Паскалем (или Дельфи), понятия не имеют, о чем вы просите здесь, и люди, которые могут пропустить ваш вопрос без тегов. –

+0

Можете ли вы опубликовать часть кода, который ее читает? – placeybordeaux

+1

Мне кажется, было бы очень легко написать приложение для быстрого тестирования, которое записывает некоторые записи в новом формате, а затем пытается прочитать их, используя старый формат; он сразу ответил бы на вопрос и дал бы вам тест, который вы могли бы использовать для будущих изменений. –

ответ

3

Старая школа паскалевской использовать первый байт строки (индекс 0), чтобы сохранить длину строки.

Давайте посмотрим на память об этой записи:

byte 0 1 2 3 4 5 6 7 8 9 10 11 12 13 ........ 243..246 247..250 
value 10 65 66 67 68 69 70 71 72 73 74 0 200 130   NewField RecType 

От байта 11 до 242, память может содержать мусор, оно просто игнорируется программой (не показано), как это имеет значение 10 в байт 0, как длина строки, поэтому строка становится 'ABCDEFGHIJ'

Это обеспечивает старую программу чтения файла, созданный с помощью самого последней версии никогда не увидит мусора в конце строк, так как зрения ngs будет ограничено фактическим размером строки и что позиции памяти просто игнорируются.

Вам нужно дважды проверить, не изменила ли старая программа значения, сохраненные в случае записи записей в файл. Я думаю, что это тоже безопасно, но я просто не уверен, и у нас нет Delphi для тестирования.

+0

Я думаю то же самое о формате строки и со старой программой клиент будет просматривать данные без редактирования –

+1

Ничего не объяснил, но вопрос был о * старом кодексе *, читающем * новые записи *. Поскольку старая запись определяла строку размером 50 байт, она действительно могла содержать строку, которая каким-то образом была пропущена, длина которой превышает 200 символов в новой записи (если, например, была сохранена фактическая 250-байтовая строка или одна который по какой-то причине дополнялся пробелами). –

+0

Все записи не содержат строк, длина которых превышает 100 символов –

Смежные вопросы