Файл, с точки зрения программы на языке Паскаль, - это именованная структура данных, представляющая собой последовательность элементов одного типа. Количество элементов файла практически не ограничено.
Все файлы можно разделить на типизированные, нетипизированные и текстовые.
Пример описаний файлов, в котором определены размеры буферов файлов различного типа:
program files;
var f1:file of real; {В стандарте f1^ - переменная типа real - типизированный файл}
f2:file; {нетипизированный файл}
f3:text; {текстовой файл}
begin
writeln(sizeof(f1),sizeof(f2),sizeof(f3))
end.
Результат: 128 128 256
Работа с файлами обеспечивается набором процедур и функций, обслуживающих файлы.
Описатель для типизированного файла выглядит так:
<имя>: file of <базовый тип>;
<имя> - файловая переменная. В стандарте файловая переменная является указателем на буфер файла. В ТР, как видно из примера, это не так.
<базовый тип> - любой, кроме файлового и записи, содержащей файловый тип.
Объявление файловой переменной задает только тип компонентов файла. Чтобы программа могла выводить данные в файл или читать данные из файла, необходимо указать конкретный файл файловой системы, т. е. задать имя файла. Имя файла задается вызовом процедуры ASSIGN, связывающей файловую переменную с конкретным файлом.
assign (var f:text; <ИмяФайла>:string); Имя файла задается согласно принятым в MS-DOS правилам. Оно может быть полным, т. е. состоять не только непосредственно из имени файла, но и включать путь к файлу. Существуют определенные договоренности при записи имени файла, например:
assign ( f, 'a:\result.txt');{Полное имя файла}assign (f,'\students\ivanov\korni.txt'); {Указан путь относительно текущей директории} Имя файла может быть задано строкой:
fname:='otchet.txt';assign(f,fname); 8.3 Процедуры открытия и закрытия файлов:
RESET(F) - открытие существующего файла F на чтение (файловая переменная F связана с существующим файлом MS DOS процедурой ASSIGN). В стандартном Паскале при открытии файла на чтение в динамической памяти создается буфер файла, в который помещается первая запись файла. Для нетипизированных файлов размер записи может быть указан вторым параметром. В ТР буфером является сама файловая переменная, размер буфера в примере пункта 8.2. Если открываемый на чтение файл не существует в файловой системе, возникает ошибка этапа выполнения программы.
REWRITE(F) – создает и открывает на запись новый файл. Если файловая переменная F связана с существующим файлом, то данные этого файла уничтожаются. В стандартном Паскале при открытии файла на запись в динамической памяти создается буфер файла для промежуточного хранения записей. Для нетипизированных файлов размеры записей могут задаваться вторым параметром. В ТР буфером является сама файловая переменная, размер буфера в примере пункта 8.2.
CLOSE(F) - закрытие файла F. При закрытии файла записи содержимое буфера выталкивается в файл. В стандарте Паскаля процедура закрытия файла разрывает связь файловой переменной (указателя) с буфером и уничтожает буфер в динамической памяти.
8.4 Процедуры ввода/вывода:
WRITE(F, E) - запись значения выражения E базового типа в файл; (не применима к нетипизированным файлам)
READ(F, V) - чтение из файла записи в переменную; (не применима к нетипизированным файлам)
BLOCKREAD; BLOCKWRITE - только для нетипизированных файлов.
SEEK(F, n) - делает доступной для обработки запись n файла F (эта процедура не применима к текстовым файлам);
EOF(F) - функция, возвращает TRUE, если достигнут конец файла F.
При работе с файлами в TP очень полезна функция IORESULT, которая возвращает значение кода ошибки выполнения последней операции ввода/вывода. Следующий фрагмент является шаблоном для открытия файла на чтение. Он позволяет избежать прерывания программы при попытке открытия на чтение не существующего файла
repeat
writeln('введите имя файла'); readln(s);
assign(f,s);
{$I-} {отключение режима прерывания выполнения программы при возникновении ошибки в/в}
reset(f);
{$I+} {включение режима прерывания выполнения программы при возникновении ошибки в/в}
i:=IORESULT;
if i<>0 then begin
writeln('Ошибка',i:3);
writeln('Попробуйте еще');
end;
until i = 0;
Здесь i – переменная типа integer, s – строка. {$I-} – псевдокомментарий – директива компилятору при выполнении дальнейших действий снять контроль проверки правильности выполнения операции ввода/вывода. Если открытие файла F прошло успешно, то IORESULT возвращает значение 0, в противном случае IORESULT возвращает код ошибки, отличный от нуля.