gpt4 book ai didi

delphi - TFileStream 和 String 操作

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

我正在尝试使用 TFileStream 写入和读取非固定字符串。不过,我遇到了访问冲突 错误。这是我的代码:

// Saving a file
(...)
count:=p.Tags.Count; // Number of lines to save (Tags is a TStringList)
FS.Write(count, SizeOf(integer));
for j := 0 to p.Tags.Count-1 do
begin
str:=p.Tags.Strings[j];
tmp:=Length(str)*SizeOf(char);
FS.Write(tmp, SizeOf(Integer));
FS.Write(str[1], Length(str)*SizeOf(char));
end;

// Loading a file
(...)
p.Tags.Add('hoho'); // Check if Tags is created. This doesn't throw an error.
Read(TagsCount, SizeOf(integer)); // Number of lines to read
for j := 0 to TagsCount-1 do
begin
Read(len, SizeOf(Integer)); // length of this line of text
SetLength(str, len); // don't know if I have to do this
Read(str, len); // No error, but str has "inaccessible value" in watch list
p.Tags.Add(str); // Throws error
end;

文件似乎保存得很好,当我用 hexeditor 打开它时,我可以找到保存在那里的正确字符串,但加载时会抛出错误。

你能帮帮我吗?

最佳答案

您保存了字节数,这就是您写入的字节数。当您读取该值时,您将其视为字符 的数量,然后读取那么多字节。不过,这不会导致您现在看到的问题,因为您正在使缓冲区比 Delphi 2009 需要的更大

问题是您读入的是字符串变量,而不是字符串的内容。你在写作时使用了str[1];阅读时也这样做。否则,您将覆盖调用 SetLength 时分配的字符串引用。

Read(nBytes, SizeOf(Integer));
nChars := nBytes div SieOf(Char);
SetLength(str, nChars);
Read(str[1], nBytes);

是的,您确实需要调用SetLengthRead 不知道它读取的是什么,所以它无法知道它需要提前将大小设置为任何值。

关于delphi - TFileStream 和 String 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11506805/

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