TURBO PASCAL |
Новости
|
Работа с файлами,или продлим жизнь данныхКакие бывают
файлы, что делают со всеми файлами,
а что - только с типизированными, нетипизированными
и текстовыми Типы файлов,или что в них хранятВ отличие от классического определения здесь и далее под (дисковым) файлом мы будем понимать непрерывную (с точки зрения программиста высокого уровня) последовательность информационных слов, обладающую собственным именем, размером и месторасположением. Другими словами мы будем подходить к (дисковым) файлам с точки зрения файловой подсистемы ОС. Доступ к дисковым файлам производится с помощью определенных ресурсов ОС; для MS-DOS это блоки описания (FCB) и/или дескрипторы (handlers). Pascal использует только второй тип ресурсов. Вообще говоря каждая ОС имеет свою специфическую файловую подсистему. Поэтому в синтаксис ЯП высокого уровня не включают средства прямой работы с дисковыми файлами. Вместо этого в него включаются базовые понятия (типы), связанные с внешними устройствами хранения информации, а подробности работы с ними детализируются в конкретных реализациях ЯП. Файлы (как типы) в Pascal'е делятся на три категории
Каждый из них обладает специфическими особенностями, однако порядок работы с ними фактически один и тот же. Последовательность работы,или общий порядокПоследовательность работы со всеми типами файлов на Pascal'е следующий
Для всех типов файлов операция сопоставления файловой переменной с именем файла на диске однотипна (чего нельзя сказать об операциях чтения и записи):
Создание файла любого типа производится с помощью
Дополнительный параметр может быть необходим только для нетипизированных файлов и указывет размер записи; по умолчанию (при отсутствии его для нетипизированных файлов) размер записи принимается равным 128 байтам. Кроме того, если создан текстовый файл, то он недоступен для чтения. Указатель чтения/записи устанавливается, естественно, на начало файла. Открытие уже существующего файла производится
При использовании данных процедур следует следить за тем, чтобы внешние файлы, с которыми связаны файловые переменные уже существовали. Смысл дополнительного параметра RecSize такой же, как и в процедуре ReWrite. Текстовый файл, открытый с помощью ReSet недоступен для записи. В случае ReSet указатель чтения/записи устанавливается на начало файла. В случае Append указатель записи устанавливается на конец файла. И, наконец, закрытие файла любого типа производится с помощью
Следует следить, чтобы файл был открыт перед попыткой закрытия. Все операции над любыми файлами на Pascal'е могут производиться с включенной проверкой правильности выполнения и с отключением таковой. Включенная проверка приводит к тому, что любая ошибка при выполнении файловой операции приводит к аварийному завершению программы, что может привести к потере данных в программе. Отключение автоматической проверки может быть произведено с помощью включения в текст программу повледовательности {I-} (без пробелов), что указывает компилятору не создавать код проверок файловых операций (то есть управляет опцией компилятора). Повторное включение проверки производится с помощью {I+}. При отключенной проверке ввода вывода контролировать правильность выполнения операций ввода-вывода можно с помощью функции
Успешное завершение операции сигнализируется кодом ошибки 0. Функция IOResult считается операцией ввода-вывода и всегда завершается успешно. Коды завершения операций можно посмотреть в справочной системе или здесь. Для любого типа файлов функция EoF(File) возвращает True, если текущий указатель стоит за концом файла (то есть записей больше прочитать нельзя). Типизированные файлыКак видно из описания типизированные файлы состоят из записей - участков одинакового размера и типа, расположенных последовательно. Записи нумируются с 0 и в один и тот же момент для операций чтения/записи доступна только одна из них. Постоянство размера каждой записи позволяет производить позиционирование - установку позиции чтения/записи - на любую из них.
Следует следить, чтобы позиция, на которую устанавливался указатель чтения/записи была правильной, то есть не выходила за пределы файла. Чтение и запись для типизированных файлов производятся процедурами
В результате выполнения любой из них файловый указатель перемещается на следующую после последней прочитанной/записанной записи (или на конец файла). Определить текущее значение файлового указателя можно с помощью функции FilePos(F), а общее количество записей - FileSize(F). Таким образом существует возможность произвольного доступа к любой из существующих записей типизированного файла. Естественное назначение типизированных файлов - сохранение/восстановление множества (стуктурированных) однотипных данных. Нетипизированные файлыНетипизированные файлы, открываясь и закрываясь также, как и типизированные, читаются и пишутся не записями, а блоками. Принципиальным различием между записью и блоком является то, что размер блока указывается при открытии нетипизированного файла (а не на этапе компиляции). Различий же в порядке работы с ними нет. Из этого можно выывести не совсем корректное, но по сути правильное определение нетипизированного файла: "типизированный файл с переменным размером записи, определяемым в момент открытия". Чтение и запись в нетипизированные файлы производится по тем же принципам - блоками. Для этого применяют процедуры
Переменная в данном случае может быть любого размера, типа и месторасположения, однако ее размер должен быть не меньше, чем <размер>*<размер_блока>, который был указан при открытии - процедуры не проверяют реальный размер переменных, а обрабатывают непрерывный участок памяти, начиная с указанной переменной. Необязательный последний параметр возвращает количество реально записанных или считанных записей. Желательно, чтобы размер записи, указанный при открытии файла, был кратен размеру блока, физически читаемого с диска или размеру блока буфера MS-DOS. Позиционирование производится посредством Seek по блокам точно так же, как и для типизированных файлов. Таким образом программист имеет возможность обращаться к любому участку файла по своему усмотрению и в произвольном порядке. Кроме того, операции чтения/записи больших блоков выполнябтся быстрее, чем множество аналогичных операций для маленьких записей. Применение нетипизированных файлов очевидно: для сохранения/восстановления (динамически размещаемых) массивов данных переменного значимого размера. Текстовые фалыТекстовые файлы состоят из строк (разной длины), разделенных парами символов возврат каретки - перевод строки (#13#10). Это обстоятельство (различие в длине строк) приводит к тому, что для текстовых файлов не могут быть применены операции позиционирования (во всяком случае быстро). Это обстоятельство делает процесс разработки алгоримов обработки текстовых файлов довольно сложной (и, как следствие, интересной) задачей программирования. Процедуры Write и Read работают
с текстовыми файлами точно так же, как с
текстовым экраном (без учета модуля CRT,
то есть без окон, цветов, etc.), то есть не
завершают строку и не переходят к чтению
новой строки соответственно. Для того,
чтобы производить эти действия, используют
процедуры WriteLN и ReadLN. Эти же
процедуры без второго параметра (переменной
типа строка) завершают текущую строку (дописывают
#13#10) и переходят к чтению новой
строки соответственно. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |