我有这样的档案:
file of record
Str: string[250];
RecType: Cardinal;
end;
但是经过一段时间使用我的客户发现的这个文件后,Str永远不会超过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 :(得分:3)
旧学校pascal字符串使用字符串的第一个字节(索引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,内存可以包含垃圾,它只是被程序忽略(从未显示),因为它将字节0处的值10作为字符串的长度,因此字符串变为{{1 }}
这确保读取使用最新版本创建的文件的旧程序永远不会在字符串末尾看到 garbage ,因为该字符串的视图将是限制为字符串的实际大小,并且只忽略内存位置。
如果旧程序将记录写回文件,则必须仔细检查旧程序是否不更改存储的值。我认为它也是安全的,但我只是不确定并且没有Delphi可以用来测试。