TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

Работа с файлами,

или продлим жизнь данных

Какие бывают файлы, что делают со всеми файлами, а что - только с типизированными, нетипизированными и текстовыми

Типы файлов,

или что в них хранят

В отличие от классического определения здесь и далее под (дисковым) файлом мы будем понимать непрерывную (с точки зрения программиста высокого уровня) последовательность информационных слов, обладающую собственным именем, размером и месторасположением. Другими словами мы будем подходить к (дисковым) файлам с точки зрения файловой подсистемы ОС. Доступ к дисковым файлам производится с помощью определенных ресурсов ОС; для MS-DOS это блоки описания (FCB) и/или дескрипторы (handlers). Pascal использует только второй тип ресурсов.

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

Файлы (как типы) в Pascal'е делятся на три категории
типизированные - file of <тип_записи>;
нетипизированные - file;
текстовые - text.

 

Каждый из них обладает специфическими особенностями, однако порядок работы с ними фактически один и тот же.

Последовательность работы,

или общий порядок

Последовательность работы со всеми типами файлов на Pascal'е следующий

  1. размещение в памяти (объявление или размещение в куче) файловой переменной соответствующего типа;
  2. связывание (ассигнование) такой переменной с именем дискового файла (как правило указывается полное имя - путь и имя);
  3. открытие/создание файла - выделение ресурса ОС для обмена информацией между дисковым файлом и программой. Файл может быть открыт как для чтения, так и для записи; для некоторых типов файлов возможно открытие одновременно для чтения и записи;
  4. непосредственно обмен информацией - чтение/запись данных из/в файл. При этом возможны перемещения по файлу - изменение позиции чтения/записи;
  5. закрытие файла - освобождение ресурса ОС.

 

Для всех типов файлов операция сопоставления файловой переменной с именем файла на диске однотипна (чего нельзя сказать об операциях чтения и записи):

Procedure Assign(Var F; S: String); связывает файловую переменную F с именем внешнего файла - S

Создание файла любого типа производится с помощью

Procedure ReWrite(Var F: File; [RecSize: Word]) создает и открывает для чтения/записи новый (пустой) внешний файл, с именем, которое указывалось при связывании файловой переменной F

Дополнительный параметр может быть необходим только для нетипизированных файлов и указывет размер записи; по умолчанию (при отсутствии его для нетипизированных файлов) размер записи принимается равным 128 байтам. Кроме того, если создан текстовый файл, то он недоступен для чтения. Указатель чтения/записи устанавливается, естественно, на начало файла.

Открытие уже существующего файла производится

Procedure ReSet(Var F [: File; RecSize: Word); открывает существующий внеший файл для чтения/записи
Procedure Append(Var F: Text); открывает для дополнения текстовый файл

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

В случае ReSet указатель чтения/записи устанавливается на начало файла. В случае Append указатель записи устанавливается на конец файла.

И, наконец, закрытие файла любого типа производится с помощью

Procedure Close(Var F); закрывает открытый файл

Следует следить, чтобы файл был открыт перед попыткой закрытия.

Все операции над любыми файлами на Pascal'е могут производиться с включенной проверкой правильности выполнения и с отключением таковой. Включенная проверка приводит к тому, что любая ошибка при выполнении файловой операции приводит к аварийному завершению программы, что может привести к потере данных в программе. Отключение автоматической проверки может быть произведено с помощью включения в текст программу повледовательности {I-} (без пробелов), что указывает компилятору не создавать код проверок файловых операций (то есть управляет опцией компилятора). Повторное включение проверки производится с помощью {I+}. При отключенной проверке ввода вывода контролировать правильность выполнения операций ввода-вывода можно с помощью функции

Function IOResult: Integer; возвращает код ошибки последней операции ввода-вывода

Успешное завершение операции сигнализируется кодом ошибки 0. Функция IOResult считается операцией ввода-вывода и всегда завершается успешно. Коды завершения операций можно посмотреть в справочной системе или здесь.

Для любого типа файлов функция EoF(File) возвращает True, если текущий указатель стоит за концом файла (то есть записей больше прочитать нельзя).

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

 

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

Procedure Seek(Var F; N: Longint); помещает текущий указатель чтения/записи файловой переменной F на запись номер N

Следует следить, чтобы позиция, на которую устанавливался указатель чтения/записи была правильной, то есть не выходила за пределы файла.

Чтение и запись для типизированных файлов производятся процедурами

Procedure Read(F, V1 [, V2, V3 ..]); читает одну или несколько записей из типизированного файла, начиная с текущей позиции чтения
Procedure Write(F, V1 [, V2, V3 ..]); записывает в файл одну или несколько записей, начиная с текущей позиции указателя записи

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

Таким образом существует возможность произвольного доступа к любой из существующих записей типизированного файла. Естественное назначение типизированных файлов - сохранение/восстановление множества (стуктурированных) однотипных данных.

Нетипизированные файлы

 

Нетипизированные файлы, открываясь и закрываясь также, как и типизированные, читаются и пишутся не записями, а блоками. Принципиальным различием между записью и блоком является то, что размер блока указывается при открытии нетипизированного файла (а не на этапе компиляции). Различий же в порядке работы с ними нет. Из этого можно выывести не совсем корректное, но по сути правильное определение нетипизированного файла: "типизированный файл с переменным размером записи, определяемым в момент открытия".

Чтение и запись в нетипизированные файлы производится по тем же принципам - блоками. Для этого применяют процедуры

Procedure BlockWrite(Var F: File; Var Buf; Count: Word; [Var Result: Word]); пишет в открытый файл F Count блоков из переменной Buf
Procedure BlockRead(Var F: File; Var Buf; Count: Word; [Var Result: Word]); читает в переменную Buf из открытого файла F Count блоков

Переменная в данном случае может быть любого размера, типа и месторасположения, однако ее размер должен быть не меньше, чем <размер>*<размер_блока>, который был указан при открытии - процедуры не проверяют реальный размер переменных, а обрабатывают непрерывный участок памяти, начиная с указанной переменной. Необязательный последний параметр возвращает количество реально записанных или считанных записей. Желательно, чтобы размер записи, указанный при открытии файла, был кратен размеру блока, физически читаемого с диска или размеру блока буфера MS-DOS. Позиционирование производится посредством Seek по блокам точно так же, как и для типизированных файлов.

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

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

 

Текстовые файлы состоят из строк (разной длины), разделенных парами символов возврат каретки - перевод строки (#13#10). Это обстоятельство (различие в длине строк) приводит к тому, что для текстовых файлов не могут быть применены операции позиционирования (во всяком случае быстро). Это обстоятельство делает процесс разработки алгоримов обработки текстовых файлов довольно сложной (и, как следствие, интересной) задачей программирования.

Процедуры Write и Read работают с текстовыми файлами точно так же, как с текстовым экраном (без учета модуля CRT, то есть без окон, цветов, etc.), то есть не завершают строку и не переходят к чтению новой строки соответственно. Для того, чтобы производить эти действия, используют процедуры WriteLN и ReadLN. Эти же процедуры без второго параметра (переменной типа строка) завершают текущую строку (дописывают #13#10) и переходят к чтению новой строки соответственно.

 

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz