|
|
|||
|
wm-help.net -> Электронная библиотека -> Pascal -> Pascal. Курс лекций. -> 34. Последовательный и прямой доступ34. Последовательный и прямой доступ
34. Последовательный и прямой доступ
Смысл последовательного доступа заключается в том, что в каждый момент времени доступна лишь одна компонента из всей последователь- ности. Для того, чтобы обратиться (получить доступ) к компоненте с номером К, необходимо просмотреть от начала файла К-1 предшествующую компоненту. После обращения к компоненте с номером К можно обращаться к компоненте с номером К+1. Отсюда следует, что процессы формирования (записи) компонент файла и просмотра (чтения) не могут произвольно чередоваться. Таким образом, файл вначале строится при помощи после- довательного добавления компонент в конец, а затем может последова- тельно просматриваться от начала до конца. Рассмотренные ранее средства работы с файлами обеспечивают после- довательный доступ. TURBO PASCAL позволяет применять к компонентным и бестиповым фай- лам, записанным на диск, способ прямого доступа. Прямой доступ озна- чает возможность заранее определить в файле блок, к которому будет применена операция ввода - вывода. В случае бестиповых файлов блок равен размеру буфера, для компонентных файлов блок - это одна компо- нента файла. Прямой доступ предполагает, что файл представляет собой линейную последовательность блоков. Если файл содержит n блоков, то они нуме- руются от 1 через 1 до n. Кроме того, вводится понятие условной гра- ницы между блоками, при этом условная граница с номером 0 расположена перед блоком с номером 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 должен быть задан номер условной границы, предшествующей блоку, к которому будет произ- водиться последующее обращение. Например, чтобы работать с блоком 4, необходимо задать значение N, равное 3. Процедура Seek работает с от- крытыми файлами. Процедура Truncate( var f ) устанавливает в текущей позиции приз- нак конца файла и удаляет (стирает) все последующие блоки.
Пример. Пусть на НМД имеется текстовый файл ID.DAT, который содер- жит числовые значения действительного типа по два числа в каждой строке - значения аргумента и функции соответственно. Количество пар чисел не более 200. Составить программу, которая читает файл, значе- ния аргумента и функции записывает в одномерные массивы, подсчитывает их количество, выводит на экран дисплея и записывает в файл компо- нентного типа RD.DAT.
Program F; var rArg, rF: Array[1..200] of Real; inf: Text; outf: File of Real; n, l: Integer; begin Assign(inf,'ID.DAT'); Assign(outf,'RD.DAT'); Reset(inf); Rewrite(outf); n:=0; while not EOF(inf) do begin n:=n+1; ReadLn(inf,rArg[n],rF[n]) end; for l:=1 to n do begin WriteLn(l:2,rArg[l]:8:2,rF[l]:8:2); Write(outf,rArg[l], rF[l]); end; close(outf) end. |
|
| бодибилдинг | Строим Домик | RU-домены за 170 рублей | Copyright © "В помощь Веб-Мастеру" (Alexander D. Belyaev) 2005-2009. При перепечатке любого материала видимая ссылка на источник "В помощь Веб-Мастеру" и все имена, ссылки авторов обязательны! Время генерации страницы: 0.073 |