Тип-файл представляет собой
последовательность компонент одного
типа, расположенных на внешнем
устройстве (например, на диске). Элементы
могут быть любого типа, за исключением
самого типа-файла. Число элементов в
файле при описании не объявляется.
Работа с физическими файлами происходит
через так называемые файловые
переменные.
Для задания типа-файла следует
использовать зарезервированные слова File
и Of, после чего указать тип компонент
файла.
Пример:
Type
N = File Of Integer; {Тип-файл целых чисел}
C = File Of Char; {Тип-файл символов}
Есть заранее определенный в Паскале
тип файла с именем Text. Файлы этого
типа называют текстовыми.
Введя файловый тип, можно определить и
переменные файлового типа:
Var
F1 : N;
F2 : C;
F3 : Text;
Тип-файл можно описать и
непосредственно при введении файловых
переменных:
Var
Z : File Of Word;
Файловые переменные имеют
специфическое применение. Над ними
нельзя выполнять никаких операций (присваивать
значение, сравнивать и т.д.). Их можно
использовать лишь для выполнения
операций с файлами (чтение, запись и т.д.).
Элементы файла считаются
расположенными последовательно, то есть
так же, как элементы линейного массива.
Отличие же состоит в том, что, во-первых,
размеры файла могут меняться, во-вторых,
способ обращения к элементам совсем
другой: невозможно обратиться к
произвольному элементу файла; элементы
его просматриваются только подряд от
начала к концу, при этом в каждый момент
времени доступен только один элемент.
Можно представить себе, что для каждого
файла существует указатель,
показывающий в данный момент на
определенный компонент файла. После
проведения операции чтения или записи
указатель автоматически передвигается
на следующий компонент.
Перед тем, как осуществлять ввод-вывод,
файловая переменная должна быть связана
с конкретным внешним файлом при помощи
процедуры Assign.
Формат:
Assign(<Имя файловой
переменной>,<Имя файла>);
Имя файла задается либо строковой
константой, либо через переменную типа
Sting. Имя файла должно соответствовать
правилам работающей в данный момент
операционной системы. Если строка имени
пустая, то связь файловой переменной
осуществляется со стандартным
устройством ввода-вывода (как правило - с
консолью).
После этого файл должен быть открыт
одной из процедур:
Reset(<Имя файловой переменной>);
Открывается существующий файл для
чтения, указатель текущей компоненты
файла настраивается на начало файла.
Если физического файла,
соответствующего файловой переменной
не существует, то возникает ситуация
ошибки ввода-вывода.
Rewrite(<Имя файловой переменной>);
Открывается новый пустой файл для
записи, ему присваивается имя, заданное
процедурой Assign. Если файл с таким
именем уже существует, то он
уничтожается.
После работы с файлом он, как правило,
должен быть закрыт процедурой Close.
Close(<Имя файловой переменной>);
Это требование обязательно должно
соблюдаться для файла, в который
производилась запись.
Теперь рассмотрим непосредственную
организацию чтения и записи.
Для ввода информации из файла,
открытого для чтения, используется уже
знакомый вам оператор Read. Правда, в его
формате и использовании вы заметите
некоторые изменения:
Read(<Имя файловой переменной>, <Список
ввода>);
Происходит считывание данных из файла в
переменные, имена которых указаны в
списке ввода. Переменные должны быть
того же типа, что и компоненты файла.
Вывод информации производит, как можно
догадаться оператор Write(<Имя
файловой переменной>, <Список вывода>);
Данные из списка вывода заносятся в
файл, открытый для записи.
Для текстовых файлов используются также
операторы Readln и Writeln с
соответствующими дополнениями,
относящимися к файловому вводу-выводу.
Любопытно, что вывод данных на монитор и
ввод с клавиатуры в языке Паскаль тоже
являются действиями с файлами. Они даже
имеют свои предопределенные файловые
переменные текстового типа: Output и Input
соответственно. Переменная Output всегда
открыта для записи, Input - для чтения. Если
не указывать файловые переменные в
операторах ввода-вывода (придем к
формату, рассмотренному в теме "Операторы
ввода-вывода"), то в случае записи по
умолчанию выбирается файл Output, в
случае чтения - Input.
Как вы знаете, любой файл конечен и
продолжать чтение из него информации
можно лишь до определенного предела. Как
этот предел установить? Проверить,
окончен ли файл, можно вызовом
стандартной логической функции Eof(<Имя
файловой переменной>)
Она вырабатывает значение True, если
файл окончен, и False - в противном
случае.
Решим следующую задачу: "Написать
программу, которая вводит с клавиатуры
список фамилий учащихся, а затем
распечатывает его, кроме тех учащихся, у
которых фамилия начинается с буквы 'Ш'".
Так как заранее количество данных не
известно, то для их хранения используем
файл. Тип элементов - строковый.
Program L;
Var
I,N : Integer;
F : File Of String;
S : String;
Begin
Assign(F,'Spis.lst'); {Связываем переменную F с
файлом Spis.lst}
Writeln('Введите количество учащихся');
Readln(N); {Вводим количество учащихся}
Rewrite(F); {Создаем файл для записи в него
данных}
For I:=1 To N Do {Для всех учащихся}
Begin
Writeln('Введите фамилию');
Readln(S);
Write(F,S)
End;
Close(F);
Reset(F);
Writeln; Writeln('Список учащихся:');
While Not(Eof(F)) Do
Begin
Read(F,S);
If S[1]<>'Ш' Then
Writeln(S)
End;
Close(F)
End.