Кінець файлу

Нехай на диску є деякий текстовий файл. Потрібно в діалогове вікно вивести вміст цього файлу. Рішення завдання досить очевидно: треба відкрити файл, прочитати перший рядок, потім другу, третю і т. д. до тих пір, поки не буде досягнутий кінець файлу. Але як визначити, що прочитана остання рядок, досягнутий кінець файлу?

Для визначення кінця файлу можна скористатися функцією EOF (End of File – кінець файлу). У функції EOF один параметр – файлова змінна. Значення функції EOF одно False, якщо прочитаний елемент даних не є останнім у файлі, т. е. можливе подальше читання. Якщо прочитаний елемент даних є останнім, то значення EOF одно True.

Значення функції EOF можна перевірити відразу після відкриття файлу. Якщо при цьому воно виявиться рівним True, то це означає, що файл не містить жодного елемента даних, т. Е. Є порожнім (розмір такого файлу дорівнює нулю).

У лістингу 7.5 приведена процедура, яка виконує поставлене завдання. Вона читає рядки з файлу, ім’я якого ввів користувач під час роботи програми, і виводить ці рядки в поле Memo. Вікно програми приведено на рис. 7.6.

Рис. 7.6. Вікно програми Читання з файлу

Лістинг 7.5. читання з файлу

unit rd_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,

Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons;
type
TForm1 = Class (TForm)
Button2: TButton;
Edit1: TEdit;
Memo1: TMemo;
Button1: TButton;
procedure Button2Click (Sender: TObject);
procedure ButtonlClick (Sender: TObject); private
{Private declarations) public
{ Public declarations} end;
var
Form1: TForml;
implementation
{$ R * .dfm}
// клацання на кнопці Відкрити
procedure TForm1.Button1Click (Sender: TObject);
var
f: TextFile; // файл fName: String [80]; // ім'я файлу

buf: String [80]; // буфер для читання з файлу

begin
fName : = Edit1.Text; AssignFile (f, fName); {$! -}
Reset (f); // відкрити для читання {$ I +}
if IOResult <> 0 then begin
MessageDlgt'Ошібка доступу до файлу '+ fName,
mtError, [mbOk], 0); exit; end;
// читання з файлу

while not EOF (f) do begin
readln (f, buf); // прочитати рядок з файлу

Memo1.Lines.Add (buf); // додати рядок в поле Memo1

end;
CloseFile (f); // закрити файл

end;
// клацання на кнопці Зберегти - запис в файл
procedure TForml.Button2Click (Sender: TObject);

var
f: TextFile; // файл

fName: String [80]; // ім'я файлу

i: integer /; begin
fName : = Edit1.Text; AssignFile (f, fName);
Rewrite (f); // відкрити для перезапису
// запис в файл
for i: = 0 to Memo1.Lines.Count do // рядки нумеруються з нуля

writeln (f, Memo1.Lines [i]);
CloseFile (f); // закрити файл
MessageDlg ( 'Дані записані в файл ', mtlnformation, [mbOk], 0);

end;
end.

Для організації обробки файлу використана інструкція циклу while, яка забезпечує перевірку значення функції EOF перед кожним читанням, в тому числі і перед першим.
Наявність кнопки Зберегти і відповідної їй процедури дозволяє зберегти вміст поля Memo в файлі, т. е. програма читання з файлу є примітивним редактор тексту.
Додавання черговий прочитаної з файлу рядки в поле Memo виконується застосуванням методу Add до властивості Lines.