【发布时间】:2014-11-26 13:45:41
【问题描述】:
TStream 类包含许多采用这种形式的 WriteData 重载:
function WriteData(const Buffer: Int32; Count: Longint): Longint; overload;
所有常见的嫌疑犯都有重载,AnsiChar、Char、UInt32、Double 等等。 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));
【问题讨论】:
-
你从不想写半个 Unicode 字符 :) ?
-
@TLama 至少在小端机器上它会是右半边!
-
在快速搜索 Delphi XE3 附带的源代码后,我发现只有 TclientDataset 组件在将数据写入流时使用带有附加大小参数的 WriteData。为什么它以这种方式使用它?我不知道。或许您在查看 TClientDataset 代码后,会自己对此有更好的理解。
-
当我有一个特定大小的动态数组时,我实际上做了很多次,但我只想将它的一部分写入文件,例如如果我在一个数组中有一个已过滤的信号,该数组具有进出数据缓冲区,并且我只想写入真实数据(没有开销),我经常引用完整的动态数组(或任何其他指向缓冲区的指针)并提供实际写入数据的计数。
-
@mrabat 这不是这里发生的事情。这里的代码能够写入部分值。所以,只有 3 个字节的整数,或者更糟糕的是,
标签: delphi delphi-xe7