TFileStream.Read没有读取文件的最后一部分

时间:2015-04-06 11:42:32

标签: delphi tfilestream

我在循环中使用TFileStream.Read来读取文本文件,但我发现最后一部分没有被读入缓冲区 - 尽管读取的总字节数等于filesize。

这是我的代码:

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不包含文件的最后一个块,而是包含第二个到最后一个块的块。我的代码有问题吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

该缓冲区的开头包含文件的最后一个块。但在那之后是前一个块的内容,因为你从未清除过缓冲区。所以你认为你的备忘录包含了前一个块,但它是两者的混合。

您可以使用复制功能只是添加缓冲区的一部分。

Memo1.Text := StringOf(Copy(buf, 0, r)); // r is the number of bytes to copy

阅读文本文件的更好方法是使用TStringListTStringReader。这些将处理文件编码(Ansi,UTF8,...)我通常更喜欢TStringList,因为我对TStringReader中的一些错误有太多麻烦。