Mar*_*lka 1 delphi tfilestream
我正在尝试使用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;
Run Code Online (Sandbox Code Playgroud)
该文件似乎保存得很好,当我用hexeditor打开它时,我可以找到保存在那里的正确字符串,但加载会丢失错误.
你能救我吗?
您保存了字节数,这就是您编写的字节数.读取该值时,将其视为字符数,然后读取该字节数.这不会导致问题,您现在看到的,不过,因为你正在做的缓冲区更大比它需要的是在2009年德尔福.
问题是你正在读取字符串变量,而不是字符串的内容.你str[1]在写作时使用过; 在阅读时也这样做.否则,您将覆盖调用时分配的字符串引用SetLength.
Read(nBytes, SizeOf(Integer));
nChars := nBytes div SieOf(Char);
SetLength(str, nChars);
Read(str[1], nBytes);
Run Code Online (Sandbox Code Playgroud)
是的,你就需要调用SetLength.Read不知道它的读数是什么,所以它无法知道它需要事先将大小设置为任何东西.