Файлы
Текстовые файлы
Эти файлы связываются с переменной, имеющей тип 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, то есть, пока файл не закончился.