簡體   English   中英

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

讀取文本文件的更好方法是使用TStringListTStringReader 這些將處理文件編碼(Ansi,UTF8等),我通常更喜歡TStringList,因為我對TStringReader中的某些錯誤有太多的麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM