gpt4 book ai didi

delphi - 读写二进制文件?

转载 作者:行者123 更新时间:2023-12-03 19:19:29 24 4
gpt4 key购买 nike

我正在将一些自定义创建的Objects类(流数据)保存到File。

我需要能够将文件的内容加载到TStringList中,以便可以在文件末尾添加新行,然后保存更改。

但是,这不起作用,因为LoadFromFile似乎无法正确解析File。我假设由于流中的有趣字符而将流另存为文件,并且TStringList需要纯文本信息。

如何执行以下操作:


将任何原始二进制文件读入TStringList。
添加我的新行,例如StringList1.Add(MyString);
再次保存原始二进制文件。


这个问题实际上与我问的另一个问题有关:Save a CRC value in a file, without altering the actual CRC Checksum?

这就是我想要做的:


计算我保存的流文件的CRC校验和。
将CRC值添加到文件的末尾。
重新保存文件。


然后,当我尝试打开流文件时:


将CRC值(在文件末尾)分配给变量。
从文件中删除CRC值。
将流文件另存为新的临时文件。
计算并比较临时文件的CRC,并将CRC存储在变量中。
如果文件的CRC与内部存储的CRC值匹配,则可以正常处理文件。


但是我不知道如何读取或写入文件的原始二进制数据。

如果有人可以给我一些帮助和建议,我将不胜感激:)

最佳答案

此类从TStringList派生,并在写入文件时在末尾添加一个检查值。每当读取文件时,都会检查此值。

type
TCRCStringList = class(TStringList)
type
TCRC = LongWord;
private
function CalcCRC(Stream: TStream): TCRC;
public
procedure LoadFromStream(Stream: TStream; Encoding: TEncoding); override;
procedure SaveToStream(Stream: TStream; Encoding: TEncoding); override;
end;

function TCRCStringList.CalcCRC(Stream: TStream): TCRC;
begin
Result := 42; // place CRC calculation here
end;

procedure TCRCStringList.LoadFromStream(Stream: TStream; Encoding: TEncoding);
var
crc: TCRC;
temp: TMemoryStream;
begin
temp := TMemoryStream.Create;
try
temp.CopyFrom(Stream, Stream.Size - Sizeof(crc));
Stream.Read(crc, Sizeof(crc));
if crc <> CalcCRC(temp) then
raise Exception.Create('CRC error');
temp.Position := 0;
inherited LoadFromStream(temp, Encoding);
finally
temp.Free;
end;
end;

procedure TCRCStringList.SaveToStream(Stream: TStream; Encoding: TEncoding);
var
crc: TCRC;
temp: TMemoryStream;
begin
temp := TMemoryStream.Create;
try
inherited SaveToStream(temp, Encoding);
temp.Position := 0;
crc := CalcCRC(temp);
temp.Position := temp.Size;
temp.Write(crc, Sizeof(crc));
Stream.CopyFrom(temp, 0); // count = 0 copies the whole stream from the beginning
finally
temp.Free;
end;
end;

关于delphi - 读写二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8617754/

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