TFileStream.Read 没有读取文件的最后一部分
TFileStream.Read not reading last part of file
我在循环中使用 TFileStream.Read 来读取文本文件,但我发现最后一部分没有被读入缓冲区 - 尽管被读取的字节总数等于文件大小。
这是我的代码:
procedure TForm1.DoImport;
var
f: String;
fs: TFileStream;
r, c: Integer;
buf: TBytes;
const
bufsiz = 16384;
begin
SetLength(buf, bufsiz);
f := 'C:\Report\Claims\Claims.csv';
fs := TFileStream.Create(f, fmOpenRead);
try
c := 0;
repeat
r := fs.Read(buf, bufsiz);
Inc(c, r);
until (r <> bufsiz);
showmessage('Done. ' + IntToStr(c)); // <-- c equals to filesize !!
Memo1.Text := StringOf(buf); // <-- but the memo does not show the last chunk of the file
finally
fs.Free;
end;
end;
最后,TMemo 不包含文件的最后一个块,而是倒数第二个块。我的代码有问题吗?
提前致谢!
该缓冲区的开头包含文件的最后一块。但在那之后是前一个块的内容,因为您从未清除缓冲区。所以你认为你的备忘录包含前一个块,但它是两者的混合。
您可以使用复制功能来只添加缓冲区的一部分。
Memo1.Text := StringOf(Copy(buf, 0, r)); // r is the number of bytes to copy
读取文本文件的更好方法是使用 TStringList
或 TStringReader
。这些将处理文件编码(Ansi、UTF8、...)我通常更喜欢 TStringList,因为我在 TStringReader 中遇到了一些错误。
我在循环中使用 TFileStream.Read 来读取文本文件,但我发现最后一部分没有被读入缓冲区 - 尽管被读取的字节总数等于文件大小。
这是我的代码:
procedure TForm1.DoImport;
var
f: String;
fs: TFileStream;
r, c: Integer;
buf: TBytes;
const
bufsiz = 16384;
begin
SetLength(buf, bufsiz);
f := 'C:\Report\Claims\Claims.csv';
fs := TFileStream.Create(f, fmOpenRead);
try
c := 0;
repeat
r := fs.Read(buf, bufsiz);
Inc(c, r);
until (r <> bufsiz);
showmessage('Done. ' + IntToStr(c)); // <-- c equals to filesize !!
Memo1.Text := StringOf(buf); // <-- but the memo does not show the last chunk of the file
finally
fs.Free;
end;
end;
最后,TMemo 不包含文件的最后一个块,而是倒数第二个块。我的代码有问题吗?
提前致谢!
该缓冲区的开头包含文件的最后一块。但在那之后是前一个块的内容,因为您从未清除缓冲区。所以你认为你的备忘录包含前一个块,但它是两者的混合。
您可以使用复制功能来只添加缓冲区的一部分。
Memo1.Text := StringOf(Copy(buf, 0, r)); // r is the number of bytes to copy
读取文本文件的更好方法是使用 TStringList
或 TStringReader
。这些将处理文件编码(Ansi、UTF8、...)我通常更喜欢 TStringList,因为我在 TStringReader 中遇到了一些错误。