TStream.WriteData和TStream.ReadData的Count参数的目的是什么?

时间:2014-11-26 13:45:41

标签: delphi delphi-xe7

TStream类包含许多此类形式的WriteData重载:

function WriteData(const Buffer: Int32; Count: Longint): Longint; overload;

所有常见嫌疑人都有超载,AnsiCharCharUInt32Double等等。同样适用于ReadData。我试图了解Count参数的用途。上述过载的实现如下:

function TStream.Skip(Amount: Integer): Integer;
var
  P: Integer;
begin
  P := Position;
  Result := Seek(Amount, soCurrent) - P;
end;

function TStream.WriteData(const Buffer: Int32; Count: Longint): Longint;
const
  BufSize = SizeOf(Buffer);
begin
  if Count > BufSize then
    Result := Write(Buffer, BufSize) + Skip(Count - BufSize)
  else
    Result := Write(Buffer, Count)
end;

我可以清楚地看到这段代码的作用,但我无法理解为什么执行部分写入会有意义。为什么用Count < BufSize调用此函数会有意义?那时的行为很奇怪。

有谁知道为什么要添加这些重载以及它们的目的是什么?我自然而然地看了documentation,这些方法没什么可说的。


顺便说一句,我将提交有关此行的错误报告:

Result := Write(Buffer, BufSize) + Skip(Count - BufSize);

假设Write的调用将在调用Skip之前发生,这是错误的。未定义+运算符的操作数的评估顺序。这段代码应该像这样编写:

Result := Write(Buffer, BufSize);
inc(Result, Skip(Count - BufSize));

2 个答案:

答案 0 :(得分:1)

理论制作

如果 TStream早于overload关键字(Delphi 3 IIRC)的引入,他们可能会引入一种方法来编写可能是int32的整数。使用&#34;字节&#34;调用该函数时变量,它将作为Integer传递给函数,然后Count参数只允许写一个字节。现在他们支持这个以实现向后兼容。

在某些情况下(如下一篇),支持Count < Bufsize确实特别愚蠢:

function WriteData(const Buffer: Int8; Count: Longint): Longint; overload;

另一种理由是在下一种情况下,变量只需要保存为流作为Int8,但在程序执行期间作为Int32处理(因为它传递给只需要{{1}的函数作为参数)。

var : Int32

我不是说它是必需的(可以解决),但在某些特殊情况下,它可能很有用。

答案 1 :(得分:0)

对我来说,似乎这段代码可以让你写一些数据而不是跳到远远落后于数据的位置。

e.g。你有一个包含多个整数的流,你想要每隔5个覆盖一次,你可以用:

mData := 15;
WriteData(mData, SizeOf(mData) * 5);