Файлы
Текстовые файлы
Эти файлы связываются с переменной, имеющей тип TextFile, и предназначены для хранения и обработки текста. Фактически, в Паскале текст - это набор строк различной длины.
В начале файла устанавливается специальный системный признак BOF (Begin Of File) - начало файла. В конце каждой строки ставится специальный признак конца строки EOLN (End Of Line) - конец линии, строки. Это два системных, невидимых символа - перевод каретки и новая строка, мы их можем выразить, как символы #13 и #10. В конце файла устанавливается признак EOF (End Of File) - конец файла.
Для доступа к записям применяются процедуры Read и Readln для чтения, Write и Writeln для записи. Мы уже знакомы с этими процедурами по "Консольные приложения и параметры программы" , где мы изучали консольные приложения, однако с текстовыми файлами эти процедуры работают несколько иначе. Во всех этих процедурах первым параметром идет файловая переменная, а вторым - список аргументов. Аргументами могут быть одна или несколько переменных строкового, символьного или числового типа. Для примера, создадим простое приложение, которое позволяет работать с текстовым файлом, занося в него построчно текст из строки TEdit.
Откройте Lazarus с новым проектом. В Caption формы напишите "Работа с текстовым файлом". Проект у нас пробный, так что имена формы, проекта и компонентов мы изменять не будем. Просто сохраните проект в папку 23-01. Установите на форму компонент TEdit и удлините его, чтобы пользователь мог ввести длинную строку. Очистите у компонента свойство Text. Ниже установите две кнопки, в Caption первой напишите "Добавить в файл", второй - "Считать из файла". Растяните их, чтобы текст на кнопках не казался прилипшим к краям. Еще ниже установите TMemo. Откройте редактор свойства Lines и удалите оттуда текст. Растяните компонент по размеру Edit1.
В результате, у вас должна получиться примерно такая форма:
С подготовительной частью закончили, займемся программированием кнопок. Сгенерируйте событие OnClick для первой кнопки. Её код будет таким:
procedure TForm1.Button1Click(Sender: TObject);
var
tf: TextFile; //текстовый файл
s: String;
begin
//если пользователь не ввел строку в Edit1, просто выйдем:
if Edit1.Text = '' then exit;
//иначе в s получаем текст:
s:= Edit1.Text;
//затем связываем файловую переменную tf с файлом mytext.txt:
AssignFile(tf, 'mytext.txt');
//далее может возникнуть исключительная ситуация, поэтому
//заключим опасный код в блок try-finally-end:
try
//если файла нет (кнопку нажали первый раз), создадим его:
if not FileExists('mytext.txt') then Rewrite(tf)
//иначе откроем для записи, установив указатель в конец файла:
else Append(tf);
//тут просто записываем строку в файл:
Writeln(tf, s);
//очищаем Edit1, чтобы пользователь видел, что событие произошло:
Edit1.Text:= '';
finally
CloseFile(tf); //закрываем файл
end;
end;
Комментарии достаточно подробны, чтобы понять код. Замечу только пару вещей. Если пользователь ничего не ввел в Edit1, то нам нет нужды открывать файл и сохранять в него пустую строку, поэтому мы просто выходим из процедуры, ничего не делая:
if Edit1.Text = '' then exit;
Когда мы открываем файл, мы вначале делаем проверку на его существование. Файла может не быть в двух случаях: пользователь нажал на кнопку первый раз, либо, поработав с файлом, и не закрывая программы, он удалил этот файл. В этом случае процедурой Rewrite мы создаем новый файл. Если же файл уже существует (кнопка нажималась, либо программа открывается не в первый раз, и файл остался с прошлых сеансов), то процедурой Append мы открываем его для записи, перемещая указатель в конец файла. Далее все просто - мы записываем строку текста в файл, очищаем Edit1 от старого текста и закрываем файл. Код второй кнопки будет похожим:
procedure TForm1.Button2Click(Sender: TObject);
var
tf: TextFile; //текстовый файл
s: String;
begin
//если файла нет, просто выходим:
if not FileExists('mytext.txt') then exit;
//иначе сначала очищаем Memo1:
Memo1.Clear;
//связываем файловую переменную tf с файлом mytext.txt:
AssignFile(tf, 'mytext.txt');
//далее может возникнуть исключительная ситуация, поэтому
//заключим опасный код в блок try-finally-end:
try
Reset(tf); //открыли файл для чтения, указатель в начале файла
//делаем, пока не конец файла:
while not Eof(tf) do begin
Readln(tf, s); //читаем в s очередную строку
Memo1.Lines.Add(s); //добавляем эту строку в Memo1
end;
finally
CloseFile(tf); //закрываем файл
end;
end;
По комментариям понятно, каким образом происходит чтение. Обратите внимание, для записи мы воспользовались процедурой Writeln, а не Write, а при чтении - Readln, а не Read. Это избавило нас от необходимости заботиться о вставке и поиске символов конца строки, рекомендую вам всегда использовать такой, более удобный способ. Весь алгоритм считывания строк мы поместили в блок while-do и считывали текст строка за строкой, пока функция Eof не вернула True, то есть, пока файл не закончился.

