Порядковый номер компоненты файла (типа Longint), которая будет обрабатываться следующей операцией ввода–вывода, возвращает функция FilePos(<ф.п.>).
End.
Else
IfIOResult <> 0 then
Begin
Var
Type
product = record
name : string;
code : word;
cost : real
end;
f1 : file ofproduct;
f2 : file ofinteger;
f3 : file ofbyte;
В последнем примере определены три файловые переменные – f1, f2, f3, соответствующие файлу из записей типа product, файлу из целых чисел и файлу из байтов. Вид файла, вообще говоря, определяет способ хранения информации в нем. Однако в Турбо Паскале нет средств контроля формата ранее созданных файлов. Поэтому, объявив, например, file ofbyte, можно работать с любым дисковым файлом, в том числе графическим изображением. При этом программист должен знать фактическую структуру файла. Типизированные файлы состоят из компонент одного и того же типа, к которым возможен прямой доступ по номеру компоненты. Нумерация компонент (записей) начинается с нуля. Данные в типизированных файлах хранятся во внутреннем машинном представлении.
Для того чтобы работать с файлом, необходимо предварительно связать файловую переменную с конкретным дисковым файлом или логическим устройством. Это делается с помощью стандартной процедуры Assign, которая имеет следующий формат:
Assign(<ф.п.>, <имя файла или логического устройства>);
где <ф.п.> – файловая переменная (правильный идентификатор, объявленный в программе как переменная файлового типа);
<имя файла или логического устройства> – переменная типа string или текстовое выражение, содержащее имя файла или логического устройства.
Имя файла – это любое выражение строкового типа, которое строится по правилам определения имен в MS DOS и может содержать имя (до 8 символов), расширение и полный путь к файлу (всего до 79 символов). Если путь к файлу не указан, файл должен располагаться в текущем (рабочем) каталоге, где находится исполняемый EXE-модуль программы.
В процедуре Assign вместо имени файла можно указывать имя логического устройства: CON – консоль, клавиатура или экран дисплея; PRN – принтер; NUL – «пустое» устройство ( приемник информации неограниченной емкости, который фактически ничего не делает). На логические устройства можно передавать только текстовую информацию.
Примеры использования процедуры Assign приведены ниже.
Assign(f1,’prod.dat’);
Assign(f2,’D:\RAB\TST\fil1.int’);
name := ’fff.doc’;
Assign(f3,name);
Основные операции, которые проводятся с файлами – это ввод и вывод данных. Для того чтобы осуществлять такие операции, файл нужно инициировать (открыть). Типизированные файлы можно открыть в двух режимах: для записи (режим создания) и для чтения и записи одновременно.
Для чтения и модификации файл открывается с помощью стандартной процедуры Reset, имеющей следующий формат:
Reset(<ф.п.>);
где <ф.п.> - файловая переменная, предварительно связанная с существующим файлом.
При выполнении этой процедуры дисковый файл подготавливается к чтению информации. В результате специальная переменная (указатель файла) будет определять начало файла, т.е. компоненту с номером 0. Если файл с указанным именем не существует, возникнет ошибка периода исполнения и программа аварийно завершит работу. Для того чтобы этого избежать, используется специальная функция IOResult, возвращающая значение 0, если открытие прошло успешно, и код ошибки в противном случае. Функция IOResult становится доступной только при отключении автоматического контроля ошибок ввода-вывода с помощью директивы компилятора {$I-}. Например, проверить, существует ли файл на диске, можно с помощью следующего фрагмента программы:
varf: file ofchar;
Assign(f,’test.dat’);
{$I-} { отключение контроля ошибок ввода-вывода }
Reset(f);
{$I+} { включение контроля ошибок ввода-вывода }
. . . { файл не существует }
. . . { файл существует }
Стандартная процедура
Rewrite(<ф.п.>);
создает новый файл, связанный с файловой переменной <ф.п.>,и открывает его для записи информации. Если процедура применяется к существующему дисковому файлу, то его содержимое стирается и никаких сообщений в программу не передается. Новый файл подготавливается к приему информации, указатель файла принимает значение 0.
Чтение данных из типизированного файла, открытого процедурой Reset, осуществляется процедурой Read, которая имеет следующий формат:
Read(<ф.п.>, <список ввода>);
где <список ввода> – список ввода, содержащий одну или несколько переменных того же типа, что и компоненты файла.
Чтение данных начинается с текущего значения указателя файла. После выполнения процедуры указатель файла увеличивается в соответствии с количеством элементов в списке ввода.
Запись данных в типизированный файл осуществляется процедурой Write, имеющей следующий формат:
Write(<ф.п.>, <список вывода>);
Здесь <список вывода> – список вывода, содержащий одно или более выражений того же типа, что и компоненты файла. После выполнения процедуры указатель файла изменяется в соответствии с длиной списка вывода.
Позиционирование указателя файла на компоненту с требуемым номером выполняется процедурой Seek, имеющей следующий формат:
Seek(<ф.п.>, <номер компоненты>);
Здесь <номер компоненты> – выражение типа Longint, определяющее номер компоненты файла, с которого будет начинаться следующая операция ввода или вывода. Нумерация записей в файле начинается с 0, а не с 1 (!).
Размер типизированного файла, т.е. количество компонент в нем, возвращает функция Filesize(<ф.п.>), имеющая тип Longint.
Количество записей в файле может быть произвольным. Часто в процессе чтения файла необходимо проверить, не достигнут ли конец файла. Поскольку попытка прочитать несуществующую запись приведет к ошибке периода исполнения программы, нужно использовать специальную логическую функцию
EOF(<ф.п.>) : boolean,
которая возвращает значение true, если файловый указатель стоит в конце файла.
Типовая схема чтения существующего файла имеет следующий вид: