从 Stream 读入动态数组
Reading from TStream into a dynamic array
Delphi 10.1 柏林。我有一个动态的记录数组。我想从 TStream
中读取 N 条记录到该数组中。我想我需要调用 ReadBuffer
,但第一个参数应该是什么样的? @MyArray 不起作用。
TStream.Read()
和 TStream.ReadBuffer()
以未类型化的 var
作为输入,这意味着您需要传入一个实际变量才能访问。
作为动态数组的变量本身只是指向第一个数组元素的指针,实际数组存储在内存中的其他地方。所以你不能将动态数组变量本身传递给Read/Buffer()
。要传递的正确 "variable" 是第一个数组元素,因此使用 MyArray[0]
或 Pointer(MyArray)^
语法取消引用数组指针。
无论哪种方式,从流中将记录直接读入数组可能有效也可能无效,这取决于您实际声明的记录类型。
如果记录只包含 POD 类型,并且它的数据对齐方式与流数据的对齐方式匹配,这将工作正常:
SetLength(MyArray, N);
if (N > 0) then
Stream.ReadBuffer(MyArray[0], N * SizeOf(MyRecord));
或:
SetLength(MyArray, N);
Stream.ReadBuffer(Pointer(MyArray)^, N * SizeOf(MyRecord));
否则,您必须从流中单独读取每条记录,根据需要反序列化任何非 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;
Delphi 10.1 柏林。我有一个动态的记录数组。我想从 TStream
中读取 N 条记录到该数组中。我想我需要调用 ReadBuffer
,但第一个参数应该是什么样的? @MyArray 不起作用。
TStream.Read()
和 TStream.ReadBuffer()
以未类型化的 var
作为输入,这意味着您需要传入一个实际变量才能访问。
作为动态数组的变量本身只是指向第一个数组元素的指针,实际数组存储在内存中的其他地方。所以你不能将动态数组变量本身传递给Read/Buffer()
。要传递的正确 "variable" 是第一个数组元素,因此使用 MyArray[0]
或 Pointer(MyArray)^
语法取消引用数组指针。
无论哪种方式,从流中将记录直接读入数组可能有效也可能无效,这取决于您实际声明的记录类型。
如果记录只包含 POD 类型,并且它的数据对齐方式与流数据的对齐方式匹配,这将工作正常:
SetLength(MyArray, N);
if (N > 0) then
Stream.ReadBuffer(MyArray[0], N * SizeOf(MyRecord));
或:
SetLength(MyArray, N);
Stream.ReadBuffer(Pointer(MyArray)^, N * SizeOf(MyRecord));
否则,您必须从流中单独读取每条记录,根据需要反序列化任何非 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;