Файлы. Файловые переменные

СОДЕРЖАНИЕ: 

  1. Организация доступа к файлам
  2. Основные операции с файлами
  3. Примеры работы с файлами*
  4. Текстовые файлы

 

Организация доступа к файлам

С термином «файл» вам уже приходилось встречаться. Прежде всего, это понятие обычно связывают с информацией на устройствах внешней памяти. В Паскале понятии файла употребляется в двух смыслах:

  • как поименованная информация на внешнем устройстве (внешний файл);
  • как переменная файлового типа в Паскаль-программе (внутренний файл).

В программе между этими объектами устанавливается связь. Вследствие этого все, что происходит в процессе выполнения программы с внутренним файлом, дублируется во внешнем файле. С элементами файла можно выполнять только две операции: читать из файла и записывать в файл.

Файловый тип переменной – это структурированный тип, представляющий собой совокупность однотипных элементов, количество которых заранее (до исполнения программы) не определено.

Для работы с файлом при описании переменных необходимо определить переменную файлового типа, которая будет считаться «представителем» этого файла в данной программе. Такая переменная называется также указателем. Структура описания файловой переменной:

Var

   <имя файла>: File Of <базовый тип>

 

В качестве базового типа можно использовать любой тип, за исключением типа File.

Пример:

Var Fi: File Of  Integer;

       Fr: File Of  Real;

       Fc: File Of  Char;

 

Файл можно представить как последовательную цепочку элементов (эл.), пронумерованных от 0, заканчивающуюся специальным кодом, называемым маркером конца (<м.к.>, <eof>):

123

Количество элементов, хранящихся в данный момент в файле, называется его текущей длиной. Существует специальная ячейка памяти, которая хранит адрес элемента файла, предназначенного для текущей обработки (записи или чтения). Этот адрес называется указателем или окном файла. Указатель всегда указывает на конкретный элемент файла, поэтому существует понятие текущий указатель.

Обычно все действия с файлами производятся поэлементно, причем с тем элементом файла, на который указывает текущий указатель. При записи или считывании указатель перемещается к следующему элементу.

Поскольку число элементов файла не задается, то последним элементом файла всегда записывается символ конца файла (eof). В языке Паскаль существует булевская функция eof(<файловая переменная>), результат которой – true, если указатель указывает на конец файла.

 

Основные операции с файлами

  • Установочные и завершающие операции

Эти операции необходимы на начальном этапе работы с файлами – для связывания файловой переменной с конкретным файлом, указания того, какие действия будут с ним проводиться и окончания работы с файлом. К ним относят:

  1. assign (f, FileName) – связывает файловую переменную f с конкретным файлом с именем FileName. Данную процедуру необходимо использовать до начала работы с файлом. FileName – выражение строкового типа вида:

Диск: \ имя каталога \ имя подкаталога \ … \ имя файла

Если имя диска и имя каталога не указывать, то берутся текущий диск и текущий каталог.

  1. reset (f) – открывает файл f для чтения, т.е. указатель устанавливается на первый элемент файла. Предполагается, что открываемый файл уже существует, в противном случае возникает ошибка.
  2. rewrite (f) – открывает файл f для записи (указатель так же, как и в предыдущем случае, устанавливается на первый элемент файла). Допускается, что файл не существует, тогда процедура создает файл с заданным именем. Если же такой файл существует, процедура удаляет из него всю информацию. В обоих случаях в результате вызова данной процедуры файловая переменная указывает на нулевой элемент файла (т.е. файл пуст).
  3. close (f) – закрывает файл f для, очищает внутренний буфер, образованный при открытии файла. Теперь указатель f можно связать с другим файлом.
  • Операции ввода-вывода

Это две операции:

  1. read (f, x1, x2, …) – считывает в переменные x1, x2, … по одному элементу из файла f, начиная с той позиции, на которую установлен указатель. Операция чтения осуществляется следующим образом: значение на которое указывает текущий указатель файла, присваивается переменной x1, указатель перемещается на следующую позицию, то же самое выполняется для переменной  x2, и т.д. Данная процедура выполнима только в том случае, если не достигнут конец файла (eof(f)=false).
  2. write (f, x1, x2, …) – записывает в файл f значения переменных x1, x2, … , начиная с той позиции, на которую указывает файловая переменная. После записи в файл нового элемента, указатель перемещается на следующую позицию. Данная функция выполнима только в том случае, когда достигнут конец файла (eof(f) = true).
  • Операции перемещения по файлу

В эту группу входят:

  1. seek (f, N) – функция, позволяющая явно изменить значение текущего указателя, установив его на элемент файла с заданным номером N (N — целочисленное выражение). Данная процедура не выполняет чтения или записи элементов файла, она лишь перемещает указатель к элементу с номером N. (Первый элемент файла имеет номер 0). Вызов процедуры с аргументами seek (f, filesize(f)) установит указатель на конец файла.
  2. filepos (f) – функция, позволяющая определить текущее положение указателя (номер элемента).
  3. filesize (f) – функция, позволяющая определить размер (кол-во элементов) файла f.
  4. eof (f) – функция, возвращающая логическое значение true, если достигнут конец файла.
  • Специальные операции

Эта группа предназначена для действий с каталогами и именами. Некоторые из операций:

  1. erase (f) – удаляет файл, связанный с файловой переменной f.
  2. rename (f, NewName) – присваивает файлу, связанному с файловой переменной f, новое имя NewName.

 

 

Примеры работы с файлами*

В качестве примеров рассмотрим три наиболее часто встречающихся действия с файлами:

  • Чтение данных из файла

Для чтения файла необходимо выполнить следующий алгоритм:

  1. связать файл с файловой переменной;
  2. открыть файл для чтения;
  3. ввести данные файла в память;
  4. закрыть файл.

Пример программы, реализующей этот алгоритм:

Program Read_File;

Var

F: File Of char;

Ch: char;

FileName: string;

Begin

Write (?Введите имя файла:?);

ReadLn (FileName);

Assign (F, FileName)

Reset (F);

While not eof (F) Do

Begin

Read (F, Ch);

Write (Ch)

End;

Close (F)

End.

После того, как мы связали файл с файловой переменной с помощью оператора  Assign(F,FileName), открываем файл с помощью оператора  Reset(F). В результате файловая переменная f указывает на первый элемент файла:

123

С помощью оператора Read(F, Ch) в переменную Ch считывается значение, которое находится в том месте файла, на которое указывает переменная F, т.е. C. Затем указатель перемещается на следующий элемент файла:

123

После этого значение переменной Ch выводится на экран с помощью оператора  Write(Ch). Затем аналогичным образом считываются из файла значения 2-го, 3-го и т.д. элементов до тех пор, пока файловая переменная не будет указывать на конец файла.

  • Запись данных в файл

Алгоритм записи данных в файл можно определить следующим образом:

  1. связать файл с файловой переменной;
  2. открыть файл для записи;
  3. записать данные из программы в файл;
  4. закрыть файл для записи.

 

Пример программы, реализующей этот алгоритм и записывающей в файл числа от 1 до 30:

Program Write_File;

Var

F: File Of integer;

i: integer;

FileName: string;

Begin

Write (?Введите имя файла: ?);

ReadLn (FileName);

Assign (F, FileName);

Rewrite (F);

For i:=1 To 30 Do

Write (F, i);

Close (F)

End.

При открытии файла с помощью процедуры Rewrite(F) файл выглядит следующим образом:

123

Так как файловая переменная указывает на конец файла, мы можем записать в него любую информацию с помощью процедуры  Write, например,

i:=1;

Write (F, i);

 123

i:=i+1;
Write (F, i);

 123


и так далее.

Необходимо отметить, что в отличии от вывода на экран, при записи информации в файл вторым аргументом оператора Write являются не выражения, а переменные. Следующие записи будут неверны:  Write(F, 1), Write(F, x+1).                        

  • Добавление данных к файлу

Пусть необходимо к уже существующему файлу добавить ряд элементов. Для этого необходимо выполнить следующие действия:

  1. открыть уже существующий файл с помощью процедуры reset (f);
  2. установить указатель файла на последний элемент с помощью процедуры seek следующим образом: seek(f, filesize(f));
  3. записать дополнительные данные;
  4. закрыть файл.

Пример: к уже имеющемуся файлу, в который занесены числа от 1 до 30, дописать числа 40, 50, 60, 70, 80.

Program Append_File;

Var

   F: File Of integer;

   i: integer;

   FileName: string;

Begin

   Write (?Введите имя файла: ?);

   ReadLn (FileName);

   Assign (F, FileName);

   Reset (F);

   Seek (F, FileSize (F));

   For i:=4 To 8 Do

   Write (F, i*10);

   Close (F)

End.

 При открытии файла с помощью процедуры Reset вся информация в файле остается без изменения, курсор устанавливается на первый элемент файла:

123

Затем с помощью операции seek(f, filesize(f)) перемещаем файловую переменную на последний элемент файла:

123

Так как файловая переменная указывает на конец файла, мы можем дописать в файл любую информацию, например, с помощью оператора Write(f, 31);

123

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

  • Описание текстовых файлов

Отдельным типом файлов являются текстовые файлы. Особенность этих файлов заключается в том, что их содержимое рассматривается как последовательность строк переменной длины, разделенных специальными символами, которые называются «конец строки». Символ конца строки при просмотре файла не виден, так же как и символ конца файла. В программе файловая переменная текстового типа описывается следующим образом:

               Var < имя файловой переменной >: text;

Каждый символ представлен во внутреннем коде (ASCII) и занимает 1 байт.

Главная особенность текстовых файлов заключается в том, что можно считывать из него и записывать в него элементы типа char, integer, real, string, boolean. Если информация несимвольная, то в процессе чтения или записи происходит ее преобразование из символьной формы во внутреннюю и обратно.

  • Процедуры и функции для работы с текстовыми файлами

Для работы с текстовыми файлами можно использовать все процедуры и функции, используемые при работе с файлами любых типов, за исключением процедуры  seek, функций  filepos, filesize. Дело в том, что заранее неизвестно, элементы какого типа находятся в файле.

Например, если в файле находится символ 5, то мы можем его считать как char, integer, real, string размером 1. В этом случае они будут занимать:  real – 4 байта; integer  — 2 байта; char – 1 байт;  string — 1 байт.

 

Для работы с текстовыми файлами определены дополнительные операции.

Функция:

eoln (f) – логическая функция, возвращающая логическое значение  true, если достигнут конец строки, и false в противном случае.

Процедуры:

  1. append (f) – открытие уже существующего текстового файла f  для добавления данных в конец файла;
  2. writeln (f) – завершение текущей строки текстового файла при его записи (записывает символ конца строки);
  3. writeln (f, x1, x2, …, xn) – запись в файл f значений переменных x1, x2, …, xn; после выполнения операции записи осуществляется переход к новой строке файла;
  4. readln (f) – переход к началу следующей строки файла f при его чтении;
  5. readln(f, x1, x2, …, xn) – чтение значений n элементов из файла f в переменные x1, x2, …, xn; после выполнения операции чтения осуществляется переход к новой строке файла.

Контрольные вопросы

  1. Понятие файла в Паскале.
  2. Что называют файловым типом переменной?
  3. Какова организация доступа к файлам?
  4. Назовите основные типы операций работы с файлами.
  5. Перечислите установочные и завершающие операции работы с файлами.
  6. Какие операции ввода-вывода существуют для работы с файлами?
  7. Назовите операции перемещения по файлу.
  8. Перечислите специальные операции для работы с файлами.
  9. Особенности работы с текстовыми файлами.