Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
80
Добавлен:
09.05.2015
Размер:
725.5 Кб
Скачать

5.2.2 Бинарные файлы

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

Текстовые файлы хранятся в формате ASCII. Между тем не все байты бинарного файла имеют ассоциированные с ними символы ASCII, т.е. если прочитать бинарный файл как текстовый, то многие символы окажутся бессмысленными. Для правильного доступа к бинарному файлу в программе должна быть точно учтена структура хранящихся в ней данных.

В Object Pascalподдерживается два вида бинарных файлов: типизированные и нетипизированные. В этом приложении главное внимание уделяется файлам более рacпространёного вида — типизированным. В типизированном файле хранится упорядоченная последовательность элементов одного и того же типа.

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

type

имя_типа_файла = file ofтип;

Имя типа файла должно быть правильным идентификатором, а тип — любым типом данных фиксированного размера. Поскольку размер элемента файла фиксирован, в объявлении типа файла не допускаются ни явные, ни неявные типы указателя. Это значит, типизированный файл не может содержать динамические массивы, длинные строки, классы, объекты, указатели, вариантные типы, другие файлы, а также любые структуры данных, содержащие элементы перечисленных типов.

Рассмотрим следующий пример:

type

StudentRec = record

lastName : String[30];

firstName : String[20];

Id : String[12];

GPA : Real;

crdtHrs : Real;

end;

StudentDB = file of StudentRec;

var

studentFile: StudentDB;

В этом фрагменте кода определяются тип записи StudentRec, тип файла StudentDB и объявляется дескриптор StudentFile. Таким образом, типизированный файл, ассоциированный с дескриптором StudentFile, содержит записи типа StudentRec с полями lastName, firstName, ID и т.д.

Как и в случае текстовых файлов, для связывания дескриптора с внешним бинарным файлом используется процедура AssignFile(). Перед использованием бинарного файла его нужно открыть с помощью процедурыReset() илиRewrite(). Независимо от использованной процедуры по умолчанию бинарный файл открывается в режиме как чтения, так и записи одновременно. Сравните: процедураReset() открывает текстовый файл только для чтения, aRewrite() — только для записи. Обе процедуры устанавливают указатель бинарного файла в его начало. ПроцедураAppend() используется только текстовыми файлами, ее применение с бинарными файлами недопустимо.

Значение глобальной переменной FileModeв момент открытия бинарного файла с помощью процедурыReset() определяет режим доступа к файлу. Допустимы следующие значения переменнойFileMode: 0 — только чтение, 1 — только запись, 2 — чтение и запись. По умолчанию значение переменнойFileModeравно 2. Если присвоить переменнойFileModeиное допустимое значение, то оно будет определять режим доступа и всех последующих вызовов процедурыReset().

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

Как и в случае текстовых файлов, в одном вызове процедуры Read() илиWrite() можно объединить операции над несколькими переменными. Следовательно, синтаксис вызова процедур Read() и Write() имеет следующий вид:

Read (дескриптор_файла, переменная1 [, переменная2, ...]);

Write (дескриптор_файла, переменная1 [, переменная2, ...]);

В бинарных файлах нет строк (в отличие от текстовых), поэтому попытка применения с ними процедур Readln() и Writeln() вызовет синтаксическую ошибку. Следовательно, процедуры Readln() и Writeln() используются только с текстовыми файлам. По этой же причине с бинарными файлами может использоваться только функция Eof(), но не Eoln().

Процедура Seek() устанавливает указатель бинарного файла на заданный элемент данных (т.е. на заданную запись). Ее синтаксис имеет следующий вид:

Seek (дескриптор_файла, Номер_записи) ;

Переменная Номер_записи типа Integer идентифицирует конкретный элемент данных, хранящихся в файле. Номер первого элемента данных равен 0. Функция FileSize() возвращает количество элементов (записей) заданного бинарного файла. Номера элементов файла лежат в диапазоне от 0 до FileSize(дескриптор_файла) -1. Для установки указателя в конец файла используется оператор

Seek (дескриптор_файла, FileSize (дескриптор_файла) ) ;

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

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

Соседние файлы в папке разработка и стандартизация