bb) „Состояние” файла определяется пятью полями:
для чтения, которое есть истина, если данный файл предназначен для ввода;
для записи, которое есть истина, если данный файл предназначен для вывода;
для литер, которое есть истина, если данный файл предназначен для литерного обмена;
для двоичн, которое есть истина, если данный файл предназначен для двоичного обмена;
открыт, которое есть истина, если данный файл связан с какой-нибудь книгой.
сс) Файл включает некоторые „процедуры обработки события”, вызываемые, когда во время обмена.возникают определенные условия. По умолчанию предусматривается, что после открытия файла эти процедуры обработки события вырабатывают ложь, когда они вызываются, но программист может предусмотреть и другие процедуры обработки события. Поскольку соответствующие поля файла не доступны прямо для пользователя, процедуры обработки события можно изменять с помощью „процедур реакции” (1, ш, п, о, р, q, г) . Процедуры обработки события всегда задают в качестве параметра имя своего файла. Если исполнение процедуры обработки события прекращается, то вызвавшая ее процедура обмена не может действовать дальше; в противном случае, если она вырабатывает истина, предполагается, что данное условие было некоторым образом исправлено, и, если возможно, обмен продолжается, но, если она вырабатывает ложь, система продолжает работу, предпринимая действия по умолчанию. Процедуры реакции таковы:
• при конце лог файла. Соответствующая процедура обработки события вызывается, когда в ходе ввода или в результате вызова установить достигается логический конец соответствующей книги (см. 10.3.1.6.dd).
Пример:
Программист хочет знать количество целых чисел на входной ленте. Файл лента ввода был открыт во внешнем блоке. Если.он напишет
начало цел п := 0;
при конце лог файла (лента ввода, (имя файл файл) лог: на f);
цк ввод (лента ввода, лок цел); п +:= 1 кц; f : печ (п)
конец,
то такое присваивание соответствующему полю из файла лента ввода нарушит ограничения на области действия, поскольку область действия процедуры (имя файл файл) лог: на f меньше области действия файла лента ввода. Поэтому ему следует написать
начало цел п := 0; файл вспомог := лента ввода; при конце лог файла (вспомог,'
• (имя файл файл) лог: на f);
цк ввод (вспомог, лог цел); п+:= 1 кц;
f: печ (п) конец.
при конце физ файла. Соответствующая процедура обработки события вызывается, когда текущий номер страницы данного файла превышает число страниц в соответствующей книге, а обмен пытаются продолжить (см. 10.3.1.6.dd).
при конце страницы. Соответствующая процедура обработки события вызывается, когда текущий номер строчки данного файла превышает число строчек на текущей странице, а обмен пытаются продолжить (см.
10.3.1.6.dd).
• при конце строчки. Соответствующая процедура обработки события вызывается, когда текущий номер литеры данного файла превышает число литер в текущей строчке, а обмен пытаются продолжить (см. 10.3.1.6.dd).
Пример:
Программист хочет, чтобы на начале каждой страницы его файла f автоматически печатался заголовок:
при конце страницы (f, (имя файл файл) лог:
(вывод (файл, (нов страница, ”стр.”, целое (i+:= 1,0). нов строчка) ); истина)
0 предполагается, что і было где-то описано ^і).
• при ошибке литеры. Соответствующая процедура обработки события вызывается, когда перекодирование некоторой литеры не было успешным или когда в ходе ввода читается не „ожидаемая” (10.3.4.1.11) литера. Эта процедура обработки события вызывается с именем литеры, предлагаемой в качестве замены. Процедура обработки события, задаваемая программи-
• стом, может присваивать литеру, отличную от предлагаемой. Если данная процедура обработки события вырабатывает истина, то используется эта предлагаемая литера с возможным ее изменением.
Пример:
Программист хочет читать суммы денег, отперфорированные в форме 123.45”,,, 23.45”, „ $ 3.45” и т. д.:
при ошибке литеры /станд ввод,
(имя файл f, имя лит пред) лог:
если пред = ”0”
то лит с; назад (f); ввод (f, с);
(с-”3” Iввод (f, пред); истина I ложь) иначе ложь все);
цел центы; ф чит ((ф 3z”. ”dd ф, центы));
• при ошибке значения. Соответствующая процедура обработки события вызывается, когда:
в ходе форматного обмена делается попытка обмена какого- нибудь значения под контролем некоторого „шаблона”, с которым оно несовместймо, или когда число „рамок” недостаточно. Если эта процедура вырабатывает истина, то текущее значение и шаблон про- . пускаются, и обмен продолжается; если же процедура вырабатыва
ет ложь, то вызывается не определено, перед которым при выводе
, выводится значение при помощи процедуры вывод;
в ходе ввода оказывается невозможным преобразовать строку в значение некоторого данного вида (это может случиться, например, при попытке прочитать целое число, большее, чем макс цел (10.2. Ес)).
при конце формата. Соответствующая процедура обработки события вызывается, когда в ходе форматного обмена формат исчерпывается, в то время как еще остается некоторое значение, подлежащее обмену. Если данная процедура вырабатывает истина, то в случае когда она не обеспечила нового формата для этого файла, вызывается не определено, а иначе пов- ‘ торяется текущий формат.
dd) Поле код файла — это его текущая кодирующая таблица (10.3.1.2.bb). После открытия файла кодирующая таблица обеспечивается по умолчанию. Другие кодирующие таблицы могут применяться программистом при помощи вызова процедуры задать код (j). Такие таблицы должны предусматриваться в библиотечном-вступлении.
ее) Процедура задать стопстроку вызывается для присоединения к файлу некоторой строки. Эту строку используют во время ввода переменного числа литер, любая из ее литер служит для окончания ввода.
ff) Имеющиеся методы доступа к книге, открытой с каким-нибудь файлом, можно узнать посредством вызовов следующих процедур (выдача такого вызова может быть функцией и этой книги, и данного канала, и некоторых других факторов обстановки, не определяемых настоящим стандартом) :
возм ввод, которая вырабатывает истина, если данный файд можно использовать для ввода;
возм вывод, которая вырабатывает истина, если данный файл можно использовать для вывода;
возм двоичн, которая вырабатывает истина, если данный файл можно использовать для двоичного обмена;
сжимаем, которая вырабатывает истина, если строчки и страницы будут сжимаемы (Ю.ЗД.б.аа) в ходе вывода; в этом случае соответствующая книга тоже называется „сжимаемой”;
возм уст нач, которая вырабатывает истина, если для данного файла возможна установка на начало, т.е. его текущую позицию можно установить в (1,1,1);
возм установка, которая вырабатывает истина, если данный файл можно установить, т.е. его текущей позиции можно придать заданное значение; соответствующая книга называется тогда книгой с „произвольным доступом”, а иначе — книгой с „последовательным доступом”;
возм переобозначение, которая вырабатывает истина, если поле обозначение данной книги можно изменить;
канал, которая вырабатывает канал, где был открыт данный файл (это можно использовать, например, при помощи процедуры, присваиваемой посредством при конце физ файла, для того чтобы открыть другой файл на том же канале).
gg) Если при книге с последовательным доступом двоичный и литерный обмен чередуются, то вызывается не определено (10.3.1.4.а), т.е. после открытия или установки на начало (10.3.1.6.j) возможен любой из этих обменов, но, если один из них имел место, другой может происходить только после очередной установки на начало.
hh) При книге с последовательным доступом вывод немедленно заставляет логический конец книги переместиться на текущую позицию (если они оба не находятся в одной и той же строчке); таким образом, за вводом не может следовать вывод без предшествующей установки на начало (10.3.1.6.j).
Пример:
начало файл fl, f2; [1 : 10 000] цел х; цел п := 0;
открыть (fl, ” ”, канал 2);
f2:=fl;
ft теперь fl и f2 можно использовать один вместо другого ft
задать код (fl, код связи);
задать код (f2, код телекса);
ft теперь fl и f2 используют разные коды; код связи и код телекса определены библиотечным-вступлением данной реализации
уст нач (fl); ft в результате на f2 тоже произойдет установка на начало ft
при конце лог файла (fl, (имя файл /) лог: на сделано); для іцк ввод (fl,x [і]); п :=ікц;
ft плохо, если при вводе окажется больше 10 000 целых чисел ft
сделано:
уст нач (fl); для і до п цк вывод (f2, х [і]) кц; закрыть (f2) ft fl тоже закроется ft конец }
вид файл = ст (имя книга книга, об (подвтекст, текст) '’-текст, канал *-кан, имя формат ^-формат, имя цел ук указатель ft фор ft мата ft, имя лог *для чтения, *-для записи, ^для литер, *-для двоичн, *-открыт,
имя позиция *- т ft екущая ft поз ft иция ft,
строк стопе ф трока ft,
код '’-код 0 ирующая таблица для литер ft,
проц (имя файл) лог *-испр ft авлен $ лог файл, *испр физ файл, ^испр ft авлена ft страница, *-испр строчка, *-испр формат, *-испр ft авлена ft ошибка значения, проц (имя файл, имя лит) лог 5-испр ft авлена ft ошибка литеры);
вид file = файл;
проц возм ^ожен ft ввод = (имя файл f) лог:
(открыт из f I (ввод из кан из f) (книга из f) | не определено; пропуск);
проц (имя файл) лог get possible = возм ввод;
проц возм вывод = (имя файл f) лог:
(открыть из fl (вывод из кан из f) (книга из!) I не определено; пропуск);
проц (имя файл) лог put possible = возм вывод;
проц возм двоичн 0ый обмен ft = (имя файл f) лог: (открыт из f I (двоичный из кан из f) (книга из f) I не определено; пропуск);
проц (имя файл) лог bin possible = возм двоичн;
проц сжимаем = (имя файл f) лог:
(открыт из f I (сжатие из кан из f) (книга из f) I не определено; пропуск);
проц (имя файл) лог compressible = сжимаем;
проц возм уст нач = (имя файл f) лог:
(открыт из f I (уст нач из кан из f) (книга из f) I не определено; пропуск);
проц (имя файл) лог reset possible = возм уст нач;
проц возм установка = (имя файл f) лог:
(открыт из f I (установка из кан из f) (книга из f) I не определено; пропуск)
;проц (имя файл) лог set possible = вбзм установка; ;
проц возм переобозначение = (имя файл f) лог;
(открыт из fl (переобозначение из кан из f)
(книга из f) I не определено; пропуск);
проц (имя файл) лог reidf possible = возм переобозначение; і) проц канал = (имя файл f) канал:
(открыт из f I кан из f I не определено; пропуск);
проц (имя файл) канал chan = канал;
проц задать код = (имя файл f, проц (имя книга) код с)
пуст: (открыт из f I код из f := с (книга из f) I
не определено);
проц (имя файл, проц (имя книга) код) пуст
make conv = задать код;
проц задать стопстроку = (имя файл f, строк t) пуст:
стопе из f:=t;
проц (имя файл, строк) пуст make term = задать стопстроку;
/ ) проц при конце лог файла = (имя файл f,
проц (имя файл) лог р) пуст: испр лог файл из f := р;
проц (имя файл, проц (имя файл) лог) пуст on logical file end = при конце лог файла;