从TStream读取到动态数组

Sev*_*yev 0 delphi pascal

德尔福10.1柏林.我有一个动态的记录数组.我想从一个TStream数组中读取N条记录.我认为我需要打电话ReadBuffer,但第一个论点应该是什么样的?@MyArray不起作用.

Rem*_*eau 5

TStream.Read()TStream.ReadBuffer()采用无类型var输入,这意味着您需要传入一个实际变量供他们访问.

作为动态数组的变量本身只是指向第一个数组元素的指针,实际数组存储在内存中的其他位置.所以你不能将动态数组变量本身传递给Read/Buffer().要传递的正确"变量"是第一个数组元素,因此使用MyArray[0]或者Pointer(MyArray)^语法取消引用数组指针.

无论哪种方式,将流中的记录直接读入数组可能会也可能不会起作用,具体取决于实际声明记录类型的方式.

如果记录只包含POD类型,并且其数据对齐方式与流数据的对齐方式匹配,则可以正常工作:

SetLength(MyArray, N);
if (N > 0) then
  Stream.ReadBuffer(MyArray[0], N * SizeOf(MyRecord));
Run Code Online (Sandbox Code Playgroud)

要么:

SetLength(MyArray, N);
Stream.ReadBuffer(Pointer(MyArray)^, N * SizeOf(MyRecord));
Run Code Online (Sandbox Code Playgroud)

否则,您必须从流中单独读取每条记录,根据需要对任何非POD类型进行反序列化,然后将其复制到数组中:

var
  Rec: MyRecord;

SetLength(MyArray, N);
for I := 0 to N-1 do
begin
  // read individual members of Rec as needed...
  Stream.ReadBuffer(Rec.SomeMember, SizeOf(Rec.SomeMember));
  ...
  MyArray[I] := Rec;
end;
Run Code Online (Sandbox Code Playgroud)