Теоретический материал: файловый ввод-вывод (Паскаль)

Способы обмена с текстовыми файлами

На этом занятии мы обобщим уже известные нам сведения о работе с текстовыми файлами и остановимся на особенностях обмена информацией между программой и текстовым файлом.

Операции чтения из файла

reset(f) - открывает существующий файл на чтение. Файловая переменная должна быть связана с внешним файлом с помощью процедуры assign.

Если существующий файл уже открыт, то он закрывается, а затем открывается вновь. Текущая позиция в файле устанавливается на начало файла.

Если f соответствует пустое имя файла (например, после вызова assign(f, '')), то после обращения к процедуре Reset(f) будет использоваться стандартный файл ввода (канал 0).

Текстовый файл становится доступным только на чтение.

При указании директивы компилятора {$I-} функция IoResult будет возвращать значение 0 в том случае, если операция завершилась успешно, и ненулевой код ошибки в противном случае.

read( [f : text], v1 [, v2, .... vn] ) - читает из текстового файла значения одной или более переменных.

Если параметр f не указан, то подразумевается использование стандартной файловой переменной Input. Каждый параметр v является переменной, значение которой должно быть прочитано из файла.

readln( [f : text], [v1, v2, .... vn] ) - выполняет процедуру read, затем переходит к следующей строке файла.

Процедура readln является расширением процедуры read и определена для текстовых файлов. Вызов readln(f) с указанием одного параметра-файловой переменной приводит к перемещению текущей позиции файла на начало следующей строки, если она имеется, в противном случае происходит переход к концу файла. Процедура readln без параметров полностью соответствует стандартному вводу.

При указании директивы компилятора {$I-} функция IoResult будет возвращать значение 0 в том случае, если операция завершилась успешно, и ненулевой код ошибки в противном случае.

Примечание: Процедура работает только для текстовых файлов, включая стандартный ввод. Файл должен быть открыт для ввода.

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

Очень часто используется следующий способ чтения из текстового файла. В качестве параметра процедуры readln задается переменная типа string; в этом случае вся очередная строка файла целиком считывается в данную переменную, длина которой автоматически устанавливается равной длине считанной строки. Полученная из файла строка далее может быть обработана так, как это необходимо. Важно отметить, что при таком способе производится чтение только "значащих" символов строки; завершающиеся символы в данном случае играют роль межстрочных разделителей и не считываются в строковую переменную. После чтения строки текущий указатель файла устанавливается на начало следующей строки.

Операции записи в файл

rewrite(f) - cоздаёт и открывает новый файл. Файловая переменная должна быть связана с внешним файлом с помощью процедуры assign.

Если внешний файл уже существует, то он удаляется, и на его месте создаётся новый пустой файл. Если файл уже открыт, то он закрывается, а затем открывается вновь. Текущая позиция в файле устанавливается на начало файла.

Если f соответствует пустое имя файла (например, после вызова assign(f, '')), то после обращения к процедуре rewrite(f) будет использоваться стандартный файл вывода (канал 1).

Текстовый файл становится доступным только на запись.

write( [f : text], v1 [, v2, .... vn] ) - записывает значения одной или более переменных в текстовый файл.

Если параметр f не указан, то подразумевается использование стандартной файловой переменной Output. Каждый параметр v является выражением, значение которого должно быть записано в файл. Выводимое выражение должно быть символьного, целого, вещественного, строкового или булевского типа.

Параметр v может иметь вид:

<выводимое выражение : мин.размер : десятичных знаков>

Например:

Var
  a:real;
. . . . . . .
write(f, a: 5: 2);

Такая запись означает, что мы в файл записываем действительное (не целое) число а, размером 5 знаков, 2 знака под дробную часть.

writeln( [f : text], [v1, v2, .... vn] ) - выполняет процедуру write, а затем записывает в файл метку конца строки (перевод строки).

При вызове данной процедуры с указанием только параметра-файловой переменной: writeln(f), в файл записывается метка конца строки. Процедура writeln без параметров полностью соответствует стандартному выводу на экран.

Примечание. Процедура работает только для текстовых файлов, включая стандартный вывод. Файл должен быть открыт для вывода.

Логическая функция Eoln

Часто для обработки текстовых файлов используется специфичная для них функция Eoln, позволяющая определить, достигнут ли конец строки. Если достигнут - значение функции равно True, а если нет - False. Таким образом, для анализа конкретных символов строк файла можно применить вложенный цикл типа:

while not Eof(FileName) do {пока не достигнут конец файла FileName, делай}
  while not Eoln(FileName) do {пока не достигнут конец очередной строки файла FileName, делай}
    begin
      {группа операторов обработки символов очередной строки}
    end;

Процедура открытия файла для дополнения

append(f : Тext) - процедура открывает существующий файл для дозаписи. Если файл уже открыт, то он сначала закрывается, а затем открывается заново. Текущая позиция устанавливается на конец файла.

Если в последнем блоке файла размером 128 байтов присутствует символ Сtrl+Z (26 в коде ASCII), то текущая позиция устанавливается в файле таким образом, что при записи первым в блоке будет "затираться" символ Сtrl+Z.

Если переменной f соответствует пустое имя файла (например, после вызова assign(f, '')), то после обращения к процедуре append переменная f будет указывать на стандартный выходной файл.

После обращения к append файл f становится доступным только на запись, и Eof(f) принимает всегда значение True(истина).

Рассмотрите несколько примеров простых программ.

Program TextFile4;
{Задача. Дан файл Primer1 на диске. Считать из него информацию и записать во вновь созданный файл Primer2 }
Var
  f, t: text;
  Put1, Put2, d: string;
  s : char;
Begin
  Put1 := 'D:\TP7\BIN\Primer1'; {Путь к файлу Primer на диске}
  assign(f, Put1 );
  reset(f); {Открыть файл c файловой пер. f на чтение}
  Put2 := 'D:\TP7\BIN\Primer2'; {Путь к создаваемому файлу}
  assign(t, Put2);
  rewrite(t); {Открыть файл c файловой пер. t на создание и запись }
  while Not Eof(f) Do
    begin
      while Not Eoln(f) do
        begin
          read(f, s); {Cчитывать из f в переменную s}
          write(t, s); {Записывать в t значение s}
        end;
      readln(f); {Переходим к чтению следующей строки файла f}
      writeln(t); {Переходим к записи следующей строки файла t}
    end;
  close(t); {Закрытие файла Primer1}
  close(f); {Закрытие файла Primer2}
End.

 

Program TextFile5;
{Задача. Дан файл Primer2 со скобками. Проверить численное соответствие закрывающих и открывающих круглых скобок}
Var
  f : Text;
  Put, s : string;
  a, i : integer;
Begin
  a := 0; {Обнуляем счетчик скобок}
  Put := 'D:\TP7\BIN\Primer2'; {Полный путь к файлу }
  assign(f, Put);
  reset(f); {Открываем файл на чтение}
  while Not Eof(f) do {Пока не конец файла, делай...}
    begin
      readln(f, s); {Считываем cтроку в переменную s}
        for i := 1 to Length(s) do {Просматриваем строку до конца}
          begin
            if s[i] = '(' {Если встретилась открывающая скобка,}
              then
                Inc(a,1); {то счетчик увеличиваем на 1}
            if s[i] = ')' {Если встретилась закрывающая скобка,}
              then
                Dec(a,1); {то счетчик уменьшаем на 1}
          end;
    end;
  close(f); {Закрытие файла}
  if a <> 0 {Если скобок одинаковое кол-во, то а=0}
    then
      writeln('No')
    else
      writeln('Yes');
   readln
End.

 

Program TextFile6;
{Задача: проиллюстрировать работу процедуры append}
Var
  f: text;
Begin
  assign(f, 'text.txt'); {создаем текстовый файл}
  rewrite(f); { Открыть файл c файловой пер. f на создание и запись}
  writeln(f, 'Исходный текст'); { Записывать в него cтроку}
  close(f); {Закрываем сформированный файл}
  append(f); {Вновь открываем этот же файл для добавления}
  writeln(f, 'Добавляемый текст'); { Пишем в конец файла cтроку}
  close(f); {Закрываем файл}
End.