Выбрать главу

ЛЕКЦИЯ № 6. Файлы

1. Файлы. Операции с файлами

Введение файлового типа в язык Pascal вызвано необходимостью обеспечить возможность работы с периферийными (внешними) устройствами ЭВМ, предназначенными для ввода, вывода и хранения данных.

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

При работе с файлами выполняются операции ввода-вывода. Операция ввода означает перепись данных с внешнего устройства (из входного файла) в основную память ЭВМ, операция вывода – это пересылка данных из основной памяти на внешнее устройство (в выходной файл). Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой.

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

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

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

Особое место в языке Pascal занимают текстовые файлы, компоненты которых имеют символьный тип. Для описания текстовых файлов в языке определен стандартный тип Text:

var TF1, TF2: Text;

Текстовые файлы представляют собой последовательность строк, а строки – последовательность символов. Строки имеют переменную длину, каждая строка завершается признаком конца строки.

Компонентные файлы

Компонентный, или типизированный файл, – это файл с объявленным типом его компонент. Компонентные файлы состоят из машинных представлений значений переменных, они хранят данные в том же виде, что и память ЭВМ.

Описание величин файлового типа имеет вид:

type М = File Of Т;

где М – имя файлового типа;

Т – тип компоненты.

Компонентами файла могут быть все скалярные типы, а из структурированных – массивы, множества, записи. Практически во всех конкретных реализациях языка Pascal конструкция «файл файлов» недопустима.

Все операции над компонентными файлами производятся с помощью стандартных процедур.

Write(f,X1,X2,...XK)

Бестиповые файлы

Бестиповые файлы позволяют записывать на диск произвольные участки памяти ЭВМ и считывать их с диска в память. Описываются бестиповые файлы следующим образом:

var f: File;

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

1. Procedure Assign(var F; FileName: String);

Процедура AssignFile сопоставляет имя внешнего файла с файловой переменной.

F – файловая переменная любого файлового типа, FileName – выражение типа String или выражение типа PChar, если допускается расширенный синтаксис. Все дальнейшие операции с F производятся с внешним файлом.

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

2. Procedure Close(var F);

Процедура разрывает связь между файловой переменной и внешним дисковым файлом и закрывает файл.

F – файловая переменная любого файлового типа, открытая процедурами Reset, Rewrite или Append. Внешний файл, связанный с F, полностью модифицируется и затем закрывается, освобождая дескриптор файла для повторного использования.

Директива {SI+} позволяет обрабатывать ошибки во время выполнения программы, используя обработку исключительных ситуаций. При выключенной директиве {$1—} необходимо использовать IOResult для проверки ошибок ввода-вывода.

3. Function Eof(var F): Boolean;

{Типизированные или нетипизированные файлы}

Function Eof[(var F: Text)]: Boolean;

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

Проверяет, является или нет текущая позиция файла концом файла.

Eof(F) возвращает True, если текущая позиция файла находится за последним символом файла или если файл пуст; иначе Eof (F) возвращает False.

Директива {SI+} позволяет обрабатывать ошибки во время выполнения программы, используя обработку исключительных ситуаций. При выключенной директиве {SI—}, необходимо использовать IOResult для проверки ошибок ввода-вывода.

4. Procedure Erase(var F);

Удаляет внешний файл, связанный с F.

F – файловая переменная любого файлового типа.

Перед вызовом процедуры Erase файл необходимо закрыть.

Директива {SI+} позволяет обрабатывать ошибки во время выполнения программы, используя обработку исключительных ситуаций. При выключенной директиве {SI—}, необходимо использовать IOResult для проверки ошибок ввода-вывода.

5. Function FileSize(var F): Integer;

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

6. Function FilePos(var F): Longlnt;

Возвращает текущую позицию файла внутри файла.

Перед использованием функции FilePos, файл должен быть открыт. Функция FilePos не используется с текстовыми файлами. F – переменная любого файлового типа, кроме типа Text.

7. Procedure Reset(var F [: File; RecSize: Word]);

Открывает существующий файл.

F – переменная любого файлового типа, связанного с внешним файлом с помощью AssignFile. RecSize – необязательное выражение, которое используется, если F – нетипизированный файл. Если F – нетипизированный файл, RecSize определяет размер записи, который используется при передаче данных. Если RecSize опущен, заданный по умолчанию размер записи равен 128 байтов.

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

8. Procedure Rewrite(var F: File [; Recsize: Word]);

Создает и открывает новый файл.

F – переменная любого файлового типа, связанного с внешним файлом с использованием AssignFile. RecSize – необязательное выражение, которое используется, если F – нетипизированный файл. Если F – нетипизированный файл, RecSize определяет размер записи, который используется при передаче данных. Если RecSize опущен, заданный по умолчанию размер записи равен 128 байтов.

Процедура Rewrite создает новый внешний файл с именем, связанным с F Если внешний файл с тем же самым именем уже существует, он удаляется, и создается новый пустой файл.

9. Procedure Seek(var F; N: Longlnt);

Перемещает текущую позицию файла к определенному компоненту. Можно использовать процедуру только с открытыми типизированными или нетипизированными файлами.

Текущая позиция файла F перемещается к номеру N. Номер первого компонента файла – 0.

Инструкция Seek(F, FileSize(F)) перемещает текущую позицию файла в конец файла.

10. Procedure Append(var F: Text);

Открывает существующий текстовый файл для добавления информации в конец файла (дозапись).