gpt4 book ai didi

delphi - 在 Delphi 中如何让 PChar 越过十六进制 00 到达文件末尾?

转载 作者:行者123 更新时间:2023-12-03 18:14:57 25 4
gpt4 key购买 nike

我正在解析非常大的文件 (Unicode - Delphi 2009),并且我有一个非常有效的例程来使用 PChar 变量来执行此操作,如 Stackoverflow 问题中所述:What is the fastest way to Parse a line in Delphi?

一切都很好,直到我遇到一个包含一些嵌入的 hex:00 字符的文件。该字符表示 PChar 字符串的结尾,我的解析在该点停止。

但是,当您加载文件时,如:

FileStream := TFileStream.Create(Filename, fmOpenRead or fmShareDenyWrite);
Size := FileStream.Size;

然后你发现文件的大小变大了很多。如果您使用记事本打开文件,它会加载到文件末尾,而不是像 PChar 那样在第一个十六进制:00 处停止。

如何在不减慢读取/解析速度的情况下仍然使用 PChar 解析读取到文件末尾?

最佳答案

您的其他问题中接受的代码在到达 #0 字符时会中断。要解决这个问题,您只需要保存输入的长度并进行检查即可。更新后的代码看起来像这样:

type
TLexer = class
private
FData: string;
FTokenStart: PChar;
FCurrPos: PChar;
FEndPos: PChar; // << New
function GetCurrentToken: string;
public
constructor Create(const AData: string);
function GetNextToken: Boolean;
property CurrentToken: string read GetCurrentToken;
end;

{ TLexer }

constructor TLexer.Create(const AData: string);
begin
FData := AData;
FCurrPos := PChar(FData);
FEndPos := FCurrPos + Length(AData); // << New
end;

function TLexer.GetCurrentToken: string;
begin
SetString(Result, FTokenStart, FCurrPos - FTokenStart);
end;

function TLexer.GetNextToken: Boolean;
var
cp: PChar;
begin
cp := FCurrPos; // copy to local to permit register allocation

// skip whitespace
while (cp <> FEndPos) and (cp^ <= #32) do // << Changed
Inc(cp);

// terminate at end of input
Result := cp <> FEndPos; // << Changed

if Result then
begin
FTokenStart := cp;
Inc(cp);
while (cp <> FEndPos) and (cp^ > #32) do // << Changed
Inc(cp);
end;

FCurrPos := cp;
end;

关于delphi - 在 Delphi 中如何让 PChar 越过十六进制 00 到达文件末尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9237991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com