Delphi Code不读取文本文件

时间:2014-05-09 10:43:39

标签: delphi

我遇到以下代码问题:

var l :string;
var f:Textfile;
begin

  assignfile(f,'c:\test\file.txt');
  reset(f);
  while not eof(f) do
  readln(f,l);
  closefile(f);

  showmessage(l);

我的问题是showmessage没有返回任何内容......它是空的,文本文件不是空的。

为什么会这样?

4 个答案:

答案 0 :(得分:5)

除了已经说过的内容:

这些天没有人使用低级文件例程。至少有两种更好的方法。第一个涉及流,第二个涉及TStringList

var sl : TStringList;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile('c:\your\file.txt');
    ShowMessage(sl.Text);
  finally
    sl.Free;
  end;
end;

免责声明:未经过测试的代码

答案 1 :(得分:3)

您读取同一变量中的每一个新行,从而用新行覆盖最后一行。如果最后一次读取返回一个空字符串(或只包含空格或输入的字符串),则您的消息框将显示为空。即使它不是空的,它也只显示最后一行,而不是整个文件。

使用l作为缓冲区。每次读取后,将其附加到另一个字符串:

var l: string;
var t: string;
var f: Textfile;
begin
  t := '';
  assignfile(f, 'c:\test\file.txt');
  reset(f);
  while not eof(f) do
  begin
    readln(f, l);
    t := t + l;
  end;
  closefile(f);

  showmessage(t);

对于大型文件,使用String Builder而不是将所有内容连接到同一个字符串更有效,因为t将在每次迭代时重新分配。

或者,使用TStringList或TFileStream来读取文件。使用TFileStream,您可以立即将整个文件读入字符串。 TStringList的优点是它解析文件并使每一行成为stringlist中的一个项目。

但是使用这些解决方案,您将把整个文件读入内存。如果你可以逐行处理它,那么在循环中进行处理。

答案 2 :(得分:2)

该行

Readln(f, l)

将当前行f放入字符串l。因此它将替换前一行,因此最后,l将只包含文件的最后一行。也许最后一行是空的?

答案 3 :(得分:1)

您文件的最后一行很可能是空的。

您可能需要尝试以下方法来查看差异:

while not eof(f) do
begin
  readln(f,l);
  showmessage(l);
end;
closefile(f);