Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ахмадулин Р.К. технологии программирования.doc
Скачиваний:
9
Добавлен:
10.11.2019
Размер:
615.94 Кб
Скачать

Последовательный и прямой доступ

К типизированным файлам можно организовать не только последовательный, но и прямой доступ.

Смысл последовательного доступа заключается в том, что в каждый момент времени доступна лишь одна компонента из всей последовательности. Для того, чтобы обратиться (получить доступ) к компоненте с номером К, необходимо просмотреть от начала файла К-1 предшествующую компоненту. После обращения к компоненте с номером К можно обращаться к компоненте с номером К+1. Отсюда следует, что процессы записи и чтения компонент файла не могут произвольно чередоваться. Файл вначале строится при помощи последовательного добавления компонент в конец, а затем может последовательно просматриваться от начала до конца.

Рассмотренные ранее средства работы с файлами обеспечивают именно последовательный доступ.

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

Прямой доступ предполагает, что файл представляет собой линейную последовательность блоков. Если файл содержит n блоков, то они нумеруются от 1 до n. Кроме того, вводится понятие условной границы между блоками, при этом условная граница с номером 0 расположена перед блоком с номером 1, граница с номером 1 расположена после блока с номером 1 и перед блоком с номером 2. Наконец, условная граница с номером n находится после блока с номером n.

Реализация прямого доступа осуществляется с помощью функций и процедур FileSize, FilePos, Seek и Truncate.

Функция FileSize(var f): Longint возвращает количество блоков в открытом файле f (не путайте с размером файла в байтах – каждый блок может занимать несколько байтов памяти).

Функция FilePos(var f): Longint возвращает текущую позицию (номер условной границы) в файле f. Для только что открытого файла текущей позицией будет граница с номером 0. Это значит, что можно записать или прочесть блок с номером 1. После чтения или записи первого блока текущая позиция переместится на границу с номером 1, и можно будет обращаться к блоку с номером 2. После прочтения последней записи значение FilePos равно значению FileSize.

Процедура Seek(var f; N: Longint) обеспечивает назначение текущей позиции в файле (позиционирование). В параметре N должен быть задан номер условной границы, которая должна стать текущей позицией. Естественно, что процедура Seek работает с открытыми файлами.

Процедура Truncate(var f) устанавливает в текущей позиции признак конца файла и удаляет (стирает) все последующие блоки.

Пример: если файл содержит более 10 компонент, то удалить все компоненты, следующие после 10-ой.

var

f: file of real;

begin

assign(f, ‘c:\test.dat’);

reset(f);

if filesize(f)>10 then

begin

seek(f, 10);

truncate(f);

end;

close(f);

end.

Вопросы для самопроверки

1. Что такое типизированные файлы?

2. Как описываются типизированные файлы в языке Паскаль?

3. Какие операции над типизированными файлами Вы знаете?

4. Что такое прямой и последовательный доступ?

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

Нетипизированный файл – это файл, для которого не объявлен тип его компонент.

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

Описание типизированных файлов

Описание нетипизированных файлов может иметь вид:

var <имя файловой переменной> : file;

Пример: описание файловых переменных в разделе var

var

f: file;

Как видно, во время описания такой переменной тип компонентов не указывается. Здесь происходит считывание или запись обычного массива байтов.

Операции над типизированными файлами

Для нетипизированных файлов применимы процедуры Assign, Reset, Rewrite, Close, Rename, Erase, Eof, IOResult, рассмотренные ранее. Именно с помощью указанных процедур над типизированными файлами производятся такие операции, как связывание с физическим файлом, открытие и закрытие файла и т.п.

По умолчанию, при открытии файлов для чтения (Reset) и для записи (Rewrite) для файлов устанавливается, что одновременно могут быть считаны или записаны 128 байт. Вы можете указать и другой размер таких «кусков», используя конструкции Reset(f, size) и Rewrite(f, size).

Для организации же ввода-вывода в нетипизированных файлах используются процедуры BlockRead и BlockWrite:

BlockRead(f, buf, count, result);

BlockWrite(f, buf, count, result);

где f – имя типизированного файла, buf – переменная (буфер), в которую будет производиться чтение или из которой произойдет запись, count – количество элементов для одновременного чтения или записи, а result – хранит количество элементов, фактически считанных или записанных (является необязательным).