Опубликован: 25.06.2014 | Уровень: для всех | Доступ: платный | ВУЗ: Учебный центр "ANIT Texno Inform"
Лекция 21:

Файлы

< Лекция 20 || Лекция 21: 1234 || Лекция 22 >

Текстовые файлы

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

В результате, у вас должна получиться примерно такая форма:

Форма проекта

Рис. 23.1. Форма проекта

С подготовительной частью закончили, займемся программированием кнопок. Сгенерируйте событие 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, то есть, пока файл не закончился.

Программа в действии

Рис. 23.2. Программа в действии
< Лекция 20 || Лекция 21: 1234 || Лекция 22 >
Инга Готфрид
Инга Готфрид
Александр Скрябнев
Александр Скрябнев

Через WMI, или используя утилиту wmic? А может есть еще какие более простые пути...