我遇到以下代码问题:
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没有返回任何内容......它是空的,文本文件不是空的。
为什么会这样?
答案 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);