У меня проблемы со следующим кодом:

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 ничего не возвращает ... он пуст, а текстовый файл не пуст.

Почему это происходит?

-1
Satch3000 9 Май 2014 в 14:43

4 ответа

Лучший ответ

Вы читаете каждую новую строку в одной и той же переменной, тем самым перезаписывая последнюю строку новой строкой. Если последнее чтение возвращает пустую строку (или строку с пробелами или вводом), ваше окно сообщения будет казаться пустым. И даже если бы он не был пустым, он показывал бы только последнюю строку, а не весь файл.

Используйте 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 имеет то преимущество, что он анализирует файл и делает каждую строку элементом в списке строк.

Но с этими решениями вы собираетесь прочитать весь файл в памяти. Если вы можете обрабатывать его построчно, выполняйте обработку внутри цикла.

3
GolezTrol 9 Май 2014 в 11:02

В дополнение к тому, что уже было сказано:

В наши дни никто не использует файловые подпрограммы низкого уровня. Есть по крайней мере два гораздо лучших подхода. Первый включает потоки, второй - TStringList:

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

Отказ от ответственности: код не протестирован

5
JensG 9 Май 2014 в 13:43

Линия

Readln(f, l)

Помещает текущую строку f в строку l. Следовательно, он заменит предыдущую строку, поэтому в конце l будет содержать только последнюю строку файла. Может последняя строчка пуста?

2
Andreas Rejbrand 9 Май 2014 в 10:49

Скорее всего, последняя строка вашего файла пуста.

Вы можете попробовать следующее, чтобы увидеть разницу:

while not eof(f) do
begin
  readln(f,l);
  showmessage(l);
end;
closefile(f);
1
Disillusioned 9 Май 2014 в 10:49