Организация работы с файлами прямого доступа 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Организация работы с файлами прямого доступа



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

Все компоненты файла прямого доступа автоматически пронумерованы, начиная с 0. Номер компонента файла типа longint, т.е. теоретически в файле прямого доступа может быть свыше 2 млн. компонентов (правда, пока таких внешних устройств не существует).

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

С файлами прямого доступа можно работать в двух режимах:

- работа с существующим файлом прямого доступа. Открывается режим с помощью процедуры reset(<имя логического файла>). Попытка открыть этот режим для несуществующего файла приводит к ошибке ввода-вывода;

- создание нового файла прямого доступа. Открывается режим с помощью процедуры rewrite(<имя логического файла>). Если до открытия в этом режиме файл существовал, то информация в нем уничтожается.

При работе с файлами прямого доступа можно использовать следующие процедуры и функции (во всех нижеприведенных подпрограммах f – это имя логического файла):

- procedure write(var f:<имя файлового типа>; r:<тип компонента файла>) - процедура записи в текущий компонент файла значения выражения, указанного при обращении к процедуре. После выполнения процедуры записи буфер файла связывается со следующим по порядку компонентом файла. Если до выполнения процедуры текущим компонентом был конец файла, то, после выполнения записи на место этого признака, в следующий компонент файла запишется признак конца файла, и буфер свяжется с этим признаком.

- procedure read(var f:<имя файлового типа>;var r:<тип компонента файла>) - процедура чтения текущего компонента файла. Прочитанное из текущего компонента значение помещается в переменную, указанную при обращении к процедуре. Текущий компонент файла - это тот компонент, с которым связан буфер файла. После выполнения процедуры чтения буфер файла связывается со следующим по порядку компонентом файла. Выполнение процедуры возможно только в том случае, если текущий компонент не является признаком конец файла. Если буфер связан с этим признаком, то при выполнении процедуры происходит ошибка ввода-вывода;

- function eof(var f:<имя файлового типа>):Boolean – с помощью этой функции можно проверить связан ли буфер с признаком конец файла. Если результат true, то буфер связан с этим признаком, если – false, то буфер не связан с признаком конец файла, а находится на каком-то существующем компоненте файла;

- procedure seek(var f:<имя файлового типа>; n:longint) - процедура установки на n-ый компонент файла прямого доступа f. При выполнении процедуры буфер файла связывается с n-ым компонентом, если такой компонент существует. В случае, если файл содержит меньшее количество компонентов, произойдет ошибка ввода-вывода (в этом случае при включенной системе прерываний по вводу-выводу программа снимется с решения);

- procedure reset(var f:<имя файлового типа>) - процедура установки на начало файла - буфер связывается с первым компонентом файла. Обращения seek(f,0) и reset(f) в процессе работы с файлом прямого доступа эквивалентны;

- procedure truncate(var f:<имя файлового типа>) - усекает файл, начиная с текущей позиции. После выполнения процедуры в текущую позицию, с которой был связан буфер, будет записан признак конца файла;

- function filepos(var f:<имя файлового типа>):longint - функция определения текущей позиции файла;

- function filesize(var f:<имя файлового типа>):longint -функция определения количества компонентов в файле (признак конца файла не учитывается).

Алгоритм сортировки файла прямого доступа

Сортировка файла методом пузырька (обменная сортировка)

Спецификация подпрограммы

  1. Назначение: сортировка файла прямого доступа из целых чисел по убыванию (файл обязательно существует; количество компонентов в файле произвольное).Файловый тип определяется ранее подпрограммы следующим образом type tf=file of integer;
  2. Имя: sortfilepuz
  3. Вид: процедура
  4. Перечень параметров:

Таблица 24.1. Перечень параметров

Статус Назначение Имя Тип Вид
Вход имя физического файла name string параметр-значение
  1. Заголовок подпрограммы: procedure sortpuz(name:string);

Метод решения

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

1. Связываем логический и физический файлы

assign(f,name);

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

reset(f);

3. Определяем размер не отсортированной части файла (перед началом сортировки это все существующие компоненты файла)

nkz:=filesize(f);

4. Повторяем просмотр не отсортированной части элементов до выполнения условия до выполнения условия – при очередном переборе элементов перестановки не было (признак отсутствия перестановки – флаг flag при отсутствии перестановки имеет значение ложь, а при наличии – значение истина)

повторять

<просмотр не отсортированной части файла>

до

При просмотре не отсортированной части выполняются следующие действия:

а) признаку перестановки при начале очередного перебора присваивается значение ложь (нет перестановки)

flag:=false;

b) перебираются все элементы не отсортированной части c начального по предпоследний. Начальный элемент имеет порядковый номер 0; предпоследний элемент – nkz-2 (минус два, т.к. нумерация не с единицы, а с нуля)

Для каждого номера элемента i выполняются следующие действия

b.1) буфер файла связывается с текущим элементом

seek(f,i);

b.2) читаются текущий и следующий элементы файла

read(f,r1,r2).

Компилятор, обрабатывая такое обращение к процедуре чтения из файла, преобразует его в эквивалентный составной оператор

begin

read(f,r1);

read(f,r2)

end;

b.3) при сортировки по убыванию, если следующий элемент больше текущего (при сортировки по возрастанию, если меньше), то буфер файла связывается с текущим компонентом; записывается в файл следующее значение, а затем текущее; формируется признак наличия перестановки (флагу перестановки присваивается истина)

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

begin

write(f,r2);

write(f,r1)

end;

c) так как в правую часть файла переместился отсортированный элемент, то размер не отсортированной части уменьшается на единицу

nkz:=nkz-1;

5. Закрываем файл для работы

close(f).

Информационная модель

Таблица 24.2. Информационная модель

Назначение Имя Тип
Имя логического файла f tf
Номер очередного компонента файла i longint
Размер неотсортированной части файла nkz longint
Значение очередного компонента файла r1 integer
Значение следующего компонента файла r2 integer
Признак наличия перестановки flag boolean

Программная модель

 

type tf=file of integer;

 

procedure sortpuz(name:string);

var f:tf;

i,nkz:longint;

r1,r2:integer;

flag:boolean;

 

begin

assign(f,name);

reset(f);

nkz:=filesize(f);

repeat

flag:=false;

for i:=0 to nkz-2 do

begin

seek(f,i);

read(f,r1,r2);

if r2>r1 then

begin

seek(f,i);

write(f,r2,r1);

flag:=true

end

end;

nkz:=nkz-1

until not flag;

close(f);

end;



Поделиться:


Последнее изменение этой страницы: 2016-06-26; просмотров: 911; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.8.34 (0.013 с.)