Файлы
Различают физические и логические файлы.
Физический файл – это именованная область носителя, предназначенная для хранения информации. Имя физического файла состоит из пути к файлу, имени и расширения, например: “D:\temp\imv\file1.dat”.
Логический файл – положительное целое число (дескриптор файла), которое при выполнении процедуры открытия файла связывается с физическим файлом.
Относительно программ, разработанных на языке BASIC, файлы можно подразделить на следующие группы: типизированные (файлы произвольного доступа), текстовые (файлы последовательного доступа) и нетипизированные файлы. Файлы произвольного доступа можно создать только с помощью программы, написанной на языке BASIC. Текстовые файлы создает программа Блокнот. Все остальные физические файлы относятся к группе нетипизированных.
В пособии рассматривается обработка файлов произвольного доступа (типизированных)..
Типизированные файлы (Файлы произвольного доступа)
Типизированный файл представляет собой последовательность компонентов одного типа. Тип компонентов может быть любой, кроме файлового типа.
|
|
Свойства типизированных файлов
Данные в типизированном файле хранятся во внутреннем представлении, при занесении данных в файл преобразование в символьное представление не происходит. Поэтому создать файл или просмотреть его в текстовом редакторе нельзя. Для этого необходимо составить программу.
Типизированный файл, как и все остальные, является файлом последовательного доступа. Но так как основное свойство типизированного файла заключается в том, что все компоненты в нем одного типа, и для их хранения выделяется одинаковое количество байт, можно организовать прямой доступ. Это значит, что к любой компоненте файла можно обратиться непосредственно, минуя предыдущие компоненты. Поэтому такие файлы называются файлами произвольного доступа.
После открытия типизированного файла можно и читать из файла, и писать в файл.
Для обмена информацией с файлом необходимо использовать переменную такого же типа, как и компоненты файла.
Структура типизированного файла имеет вид, представленный на рис.1.
EOF | ||||||
|
Рис 1.
Все компоненты в файле пронумерованы, имеют одинаковую длину. В конце файла ставится признак конца (End Of File). Каждый файл имеет указатель, который содержит адрес компоненты, с которой возможен обмен в данный момент. Указатель сдвигается на следующую компоненту при каждом чтении из файла или записи в файл.
В таблице 1 приведены стандартные процедуры для работы с типизированными файлами.
|
|
Таблица 1. Процедуры для работы с типизированными файлами
Имя процедуры | Выполняемая работа и примеры |
FileOpen(<дескриптор файла>, <имя физического файла>, <режим работы>,,,<длина компонента файла>) | § Связывает имя физического файла с дескриптором. После выполнения этой процедуры у файла в программе появится «псевдоним» - дескриптор файла. Далее все подпрограммы обращаться к файлу должны, задавая дескриптор. В качестве дескриптора необходимо использовать целое положительное число. § <Режим работы> - OpenMode.Random Пример 1. Файл целых чисел. Dim a as integer, fn as string Fileopen(1,fn,OpenMode.Random,,,len(a)) Пример 2. Файл структур. Dim a as student, fn as string (student - тип-структура. Включает поля Фамилия, группа, массив оценок и т.д. Fileopen(2,fn,OpenMode.Random,,,80) 80 – длина каждого компонента файла. Предварительно необходимо сделать оценку длины, исходя из состава полей структуры. И задать такую длину компонента файла, чтобы хватило места для самой длинной записи о студенте. |
Fileget(<дескриптор файла>, <имя переменной соответствующего типа>) | § Читает из файла содержимое очередного компонента и записывает в переменную. § Указатель сдвигается на следующий компонент файла. Реализуется последовательный доступ к элементам файла. § Если указатель достигает признак конца файла (EOF) и делается попытка чтения из файла, то происходит прерывание работы программы. Dim a as integer Fileopen(1,fn,OpenMode.Random,,,len(a)) Fileget(1,a) |
Fileget(<дескриптор файла>, <имя переменной соответствующего типа>, <номер компонента файла>) | § Указатель файла перемещает на компонент, номер которого задан. § Читает из файла содержимое соответствующего компонента и записывает в переменную. Реализуется прямой доступ к элементам файла. (Если делается попытка чтения после конца файла, то происходит прерывание работы программы.) § Указатель сдвигается на следующую компоненту файла. Dim a as integer Fileopen(1,fn,OpenMode.Random,,,len(a)) Fileget(1,a,5) |
Fileput(<дескриптор файла>, <имя переменной соответствующего типа>) | § Записывает в файл значение переменной в компонент, на котором стоял указатель файла. § После записи переменной указатель сдвигается на следующий компонент файла. Реализуется последовательный доступ к элементам файла. Dim a as integer a=15 Fileopen(1,fn,OpenMode.Random,,,len(a)) Fileput(1,a) |
Fileput(<дескриптор файла>, <имя переменной соответствующего типа>, <номер компонента файла>) | § Указатель файла перемещает на компонент, номер которого задан. § Записывает в файл значение переменной в соответствующий компонент файла. Реализуется прямой доступ к элементам файла. § После записи переменной указатель сдвигается на следующий компонент файла. Dim a as integer a=15 Fileopen(1,fn,OpenMode.Random,,,len(a)) Fileput(1,a,6) |
Fileclose((<дескриптор файла>) | § Прерывает связь между дескриптором и физическим файлом. § Файл окончательно обновляется и закрывается. FileClose(1) |
Kill(<имя физического файла>) | Удаляет физический файл из папки. Перед использованием Kill(fn) необходимо файл закрыть. FileClose(1) Kill(fn) |
Rename(<старое физическое имя файла>, <новое физическое имя файла>) | Переименовывает внешний физический файл. Rename(Fn,”A:\b.dat”) |
В таблице 2 приведены стандартные функции для работы с типизированными файлами.
Таблица 2. Функции для работы с типизированными файлами
Имя функции | Выполняемая работа и примеры |
Eof(<дескриптор файла >) as Boolean; | Проверяет, стоит ли указатель файла на признаке конца файла? Если да, возвращает True, иначе False. If Eof(1) then... |
Lof(<дескриптор файла >) as integer; | Возвращает длину файла в байтах. Dim dl as integer dl=Lof(F) |