Меню
Главная
Авторизация/Регистрация
 
Главная arrow Информатика arrow Введение в язык Pascal
Посмотреть оригинал

Буферная переменная и ее использование

Вспомним стандартную процедуру чтения компоненты файла read (f, v). Результат выполнения этого оператора процедуры состоит из двух действий: первое — копирование значения компоненты файла f, на которую указывает окно, и присваивание этого значения переменной v; второе — передвижение окна на следующую позицию файла. В некоторых задачах удобно иметь возможность выполнить эти два действия отдельно. Вот для таких приложений и удобно использовать буферные переменные файлов.

Предположим, что файл f установлен в режим чтения. Тогда буферной переменной будем называть конструкцию ft, т.е. к имени файловой переменной справа приписывается символ Т. Эту переменную не надо описывать в разделе описания переменных, она определяется автоматически с введением в употребление файловой переменной. Тип этой буферной переменной совпадает с типом компонент файла. Со значением этой буферной переменной можно выполнять любые операции, которые можно выполнять с любой другой переменной — естественно, с учетом тех ограничений, которые накладывает тип значений компонент соответствующего файла. В режиме чтения значением переменной ft всегда является копия той компоненты файла, на которую указывает окно. При выполнении оператора процедуры reset(f), где f — некоторая файловая переменная, происходит не только установка окна на начало файла f но и присваивание значения первой компоненты файла буферной переменной ft, что можно изобразить следующим образом:

Если выполнен оператор процедуры reset(f), а файл f в действительности пуст, т.е. значение стандартной функции eof(f) равно true, то значение буферной переменной ft считается неопределенным. Окно файла в этом случае сразу указывает на конец файла.

Для передвижения окна на следующую компоненту непустого файла предусмотрена стандартная процедура с именем get, параметром которой является имя файловой переменной: get(f). Результат выполнения этой процедуры состоит в передвижении окна на следующую позицию файла с присваиванием значения этой следующей компоненты буферной переменной. В случае если окно файла указывает на последнюю компоненту и выполняется процедура get, то после выполнения этой процедуры окно файла будет указывать на конец файла (значение функции eof будет равно true), а значение буферной переменной считается неопределенным.

В режиме записи значений в файл, который устанавливается после выполнения процедуры rewrite, буферная переменная выполняет роль поставщика значений компонент файла. Стандартная процедура put(f) производит запись в конец файла f в качестве очередной компоненты значение буферной переменной ft (после чего значение ft становится неопределенным) и сдвигает окно на следующую позицию, в которую помещается маркер конца файла, тем самым подготавливаясь для записи очередной компоненты. Таким образом, прежде чем выполнить оператор put(f), необходимо задать значение буферной переменной ft. Это можно сделать, например, с помощью оператора присваивания ft := е, где е — выражение того же типа, что и компоненты файла. Действия стандартной процедуры put при условии, что f — это файл из целых чисел, можно изобразить так:

состояние файла f и буферной переменной ft до выполнения процедуры put(f)

после выполнения процедуры put(f)

Отметим следующее свойство: если файл f находится в режиме записи, то значение функции eof(f) всегда равно true.

Пример 12.2. Заданы два целочисленных файла f и g одинаковой длины. Образовать третий целочисленный файл h, компоненты которого определяются по правилу h, = max(f,-, g().

{Пример 12.2. Ершова Н.В. ф-т ВМиК МГУ 8.3.09 г.

По заданным целочисленным файлам f и g образовать файл h, где hi=max(fi,gi)}

{Использование процедур get и put) program максэлем (f,g,h);

var

f,g,h: file of integer;

begin

reset(f); reset(g); rewrite(h);

while not eof(f) do

begin if fT>gT then hT:=fT else hT:=gT; put(h); get(f); get(g)

end

end.

Характерная черта приведенного выше примера состоит в том, что в нем исключены вспомогательные переменные целого типа за счет использования буферных переменных и стандартных процедур put и get.

Если вспомнить введенные ранее стандартные процедуры read и write, то следует сказать о полной эквивалентности действий оператора процедуры read(f, v) и следующего составного оператора

begin v:=fT; get(f) end

а также оператора процедуры write(s, w) и следующего составного оператора:

begin sT:=w; put(s) end

 
Посмотреть оригинал
< Предыдущая   СОДЕРЖАНИЕ   Следующая >
 

Популярные страницы