我从您之前接受的答案中获取了代码,并通过添加两个附加变量对其进行了略微修改:
FPosInt: NativeUInt;
FSize: NativeUInt;
FSize
在构造函数中使用字符串长度进行初始化(字符串变量存储了它的长度,而 PChar 没有)。
FPosInt
是文件中当前字符的编号。构造函数中的附加代码:
FSize := Length(FData);
FPosInt := 0;
然后函数中的相关部分GetNextToken
不再停止在第一个零字节处,而是继续直到到达字符串的最后一个字符:
// skip whitespace; this test could be converted to an unsigned int
// subtraction and compare for only a single branch
while (cp^ <= #32) and (FPosInt < FSize) do
begin
Inc(cp);
Inc(FPosInt);
end;
// end of file is reached if the position counter has reached the filesize
Result := FPosInt < FSize;
我在 while 条件下切换了这两个语句,因为它们是从左到右评估的,而第一个语句将更频繁地评估为 false。
另一种方法不计算字符数,而是保存指针的起始位置。在构造函数中:
FSize := Length(FData);
FStartPos := NativeUInt(FCurrPos);
并在GetNextToken
:
// skip whitespace; this test could be converted to an unsigned int
// subtraction and compare for only a single branch
while (cp^ <= #32) and ((NativeUInt(cp) - FStartPos) < FSize) do
Inc(cp);
// end of file is reached if the position counter has reached the filesize
Result := (NativeUInt(cp) - FStartPos) < FSize;