
- •Содержание
- •Тема 1. Основные понятия
- •1.2. Задача, алгоритм, программа
- •1.2.Структура модуля исходного кода
- •Тема 2. Линейный блок: оператор присваивания, переменная, процедура и функция
- •2.1 Линейный блок
- •2.2. Переменные и константы
- •Синтаксис объявления переменной в ObjectPascal
- •Синтаксис объявления именной константы в ObjectPascal
- •Синтаксис объявления переменных в VisualBasic
- •2.3Типыпеременныхиконстант
- •Var1: type definitions;
- •Var2, var3: type definition4;
- •Var4 : typel;
- •2.4. Простые типы данных
- •2.4.1. Порядковые типы
- •Поддиапазонные типы
- •Перечислимые типы
- •Операции над порядковыми типами
- •2.4.2. Целые переменные
- •Integer Shortint Smallint Longint Byte Word Cardinal
- •Физические целые типы
- •Логические целые типы
- •2.4.3. Вещественные переменные
- •Вещественные типы.
- •2.4.4. Строковые переменные
- •2.4.5. Булевы типы
- •Размеры переменных булевых типов
- •2.5. Процедуры и функции
- •Описание и вызов процедуры
- •Описание и вызов функции
- •Передача параметров
- •2.6 Область видимости переменных, констант, процедур и функций
- •2.7 Стандартные функции
- •Функции преобразования типов
- •Математические функции
- •Функции вещественных типов
- •Функции обработки строк
- •Строковые функции
- •2.8 Операции над данными
- •2.9 Приоритеты операций
- •2.10. Структурные типы
- •2.10.1. Записи
- •1: Variantnamel: varianttype3;
- •2, 3: Variantname2: varianttype4;
- •1: (KinfWorker: String[15];
- •2: (PosAdmin: String[20]);
- •2.10.2. Массивы
- •Var ИмяМассива: array [ТипИндекса1, ...., ТипИндексаN] of БазовыйТип
- •Var MyArray: Array [1..10] of Integer;
- •2.10.3. Множества
- •Var MyAlphaSet: CharSet;
- •2.10.4. Файловый тип
- •2.11. Указательные типы
- •Средства работы с указателями
- •2.12. Процедурные типы
- •2.13. Тип variant
- •Тема 3. Блок принятия решений: операторы ветвления
- •3.1 Оператор if
- •If условие1 then
- •3.3Операторcase
- •Тема 4. Цикличекий блок: операторы повторяющихся действий
- •4.1.Цикл for
- •4.2. Циклы while и repeat
- •4.3. Операторы break и cont inue
- •Тема 5. Работа с текстовыми файлами
- •5.1. Типы доступа к текстовым файлам
- •5.2. Текстовые файлы
- •5.2.2 Бинарные файлы
- •Id : String[12];
- •Тема 6. Работа с классами
- •6.1. Понятие класса
- •6.2. Классы в object pascal
- •6.3. Свойства класса
- •Способ глобальных и локальных переменных
- •Способ процедуры свойств
- •Создание и удалениеобъектов
- •Inherited Create;
- •Inherited Destroy;
- •6.4. Методы класса
- •6.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(), которая разрывает между дескриптором и внешним файлом.