1227
.pdf3.4Позиционирование файла
При открытии последовательного файла он устанавли вается в свое начало (если, однако, файл не был открыт с параметром ACCESS=’APPEND’).
Если следующей операцией ввода/вывода является опе рация записи, то все "старые” данные в файле "отбрасывают ся". После последовательных операторов WRITE, файл уста навливается в позицию записи ’"конец файла" (но не за ней!).
При исполнении оператора ENDFILE маркер конца файла устанавливается в текущую позицию, а затем файл позиционируется после маркера ’ конец-файла"
Оператор BACKSPACE должен исполняться для пози ционирования файла в позицию перед маркером "конец-фай ла". Любые данные после этой позиции теряются.
При исполнении оператора READ в конце файла файл позиционируется после записи ’конец-файла"; при этом выда ется сообщение об ошибке. Попытка прочитать запись "конец файла" приводит к ошибке, если в операторе READ не_специфицирован параметр END=, ERRили Ю5ТАТ=.
3.5Внутренние файлы
Большинство файлов на языке ФОРТРАН являются внешними, т.е. они либо являются физическим устройством, либо представляют собой файл, который "известен" опера ционной системе. Внутренним файлом является символьная переменная, символьный элемент структуры, символьная под строка, элемент символьного массива, символьный массив или нссимвольный массив. Различаются два основных типа внут ренних файлов:
1. Символьная переменная, элемент символьного массива, символьная подстрока, несимвольный массив, символьный элемент структуры. В этом случае файл имеет только одну запись, которая имеет ту же длину, что.и переменная, элемент массива, подстрока или несимвольный массив. Нссимвольный массив применяется для обеспечения совместимости с преды дущими версиями языка ФОРТРАН.
2. Символьный массив. Здесьфайл является последователь ностью элементов символьного массива, каждый из которых представляет собой запись. Последовательность записи совпа дает с последовательностью элементов массива. Все записи одинаковой длины: они имеют длину равную длине элементов
массива.
При использовании внутренних файлов необходимо
следовать следующим правилам:
1. Использовать только форматированный, последователь ный ввод/вывод;
2.Для передачи (данных) во внутренний файл следует ис пользовать только операторы READ и WRITE;
3.Не использовать форматирование, управляемое списком.
Перед исполнением оператора ввода/вывода внутрен ние файлы позиционируются в начало файла.
Для внутренних файлов пользователь может использо вать системные свойства форматирования ввода/вывода; эти свойства используются для преобразования внешнего пред ставления символов во внутреннее представление, характер ное для языка ФОРТРАН, т.е. при чтении из внутреннего файла происходит преобразование символьных (ASCII) зна чений в числовые, логические или символьные значения; при записи во внутренний файл происходит преобразование зна чений в их (внешнее) символьное (ASCII) представление. Ес ли во внутренний файл записывается неполная запись, то ее "остаток ’ заполняется пробелами.
ПРИМЕЧАНИЕ
Оператор DECODE языка ФОРТРАН 66 может быть заменен внутренней функцией READ. Оператор ENCODE — внутренней функцией WRITE.
3.6Управление кареткой
При передаче записи на терминальное устройство, например на экран или принтер, при использовании формат ного ввода/вывода, первый символ этой записи интерп ретируется как символ управления кареткой и при этом нс печатается.
Действие выполняемые при указании символов 0, 1, + и символа пробела в качестве первого символа записи, пе речислены в табл.3.6. Любой другой символ обрабатывается как символ пробела. Если первый символ записи не печатает ся, то следует убедиться в том, что он не интерпретируется как символ управления кареткой.
Таблица 3.6 Символы управления кареткой
Символ |
Действие |
Пробел |
Передвижение вперед на одну строку |
0 |
Передвижение вперед на две строки |
1 |
Передвижение в начало следующей |
|
страницы |
+Передвижения не происходит
Вслучае ввода/вывода управляемого списком, первый символ не обрабатывается как символ управления кареткой.
ПРИМЕЧАНИЕ Когда на экран в качестве символа управление кареткой
передается 1, то программа генерирует ASCII-код прогона бу маги, возврата на одну позицию, пробел и перевод каретки, Это происходит потому, что в противном случае символ прого на бумаги будет отображаться на экране как графический сим вол; действие этого символа будет игнорироваться.
При записи терминальных файлов, маркер "конец за писи" в общем случае не генерируется до тех пор, пока не будет записана следующая запись. Однако, если операция записи на
экран чередуется с операцией чтения с клавиатуры, то символ новой строки генерируется автоматически и строка входных данных позиционируется сразу подстрокой выходных данных. Для подавления символа новой строки и отображения входных данных в той же строке, где отображались предыдущие выход ные данные, следует использовать символ обратного слэша в качестве разделителя описателей полей в операторе WRITE. Входные данные будут появляться в конце последней записан ной строки.
Поскольку входные строки всегда заканчиваются сим волом новой строки, то следующая операция записи всегда начинает выполняться с новой строки. Поэтому, если последу ющей операцией является операция записи, то управление кареткой настраивается таким образом, что при выполнении указанной операции записывается на один маркер конца за писи меньше.
Следует отметить, что если предыдущей операцией бы ла операция чтения, то символ управления кареткой (+) не оказывает никакого действия.
3.7Форматированный ввод/ вывод
Если операторы READ или WRITE содержат специфи каторы формата, то оператор ввода/вывода является операто ром форматного ввода/вывода. В заключении данного подраз дела рассматриваются элементы спецификаторов формата, а также взаимосвязь между спецификаторами формата и спис ком ввода/вывода. (См. также подразд.3.2.7).
3.7.1Неповторяющиеся дескрипторы
преобразования
Неповторяющиеся дескрипторы преобразования пере числены в табл.3.7. Каждый из перечисленных дескрипторов рассмотрен в последующих подразделах.
3.7.1.1Преобразование апострофа
Если спецификатор формата содержит символьную кон станту, то она передается на устройство вывода без преобразо вания. Встроенные в символьную константу пробелы являются значащими.
Для представления в символьной константе символа апострофа необходимо использовать двойной апостроф. Каж дый дополнительный уровень встраивания апострофов требу ет двойного их указания для каждого уровня встраивания.
Преобразование апострофа не может быть использовано при применении операторов READ.
3.7.1.2 Дескрипторы преобразования: Tab, lab Left, Tab Right ( T, TL, TR )
Дескрипторы преобразования T, TL и TR указывают позицию в записи, в которую (или из которой) перемещается указатель текущей позиции. Новая позиция может находить-
Формат |
Имя |
Использование |
Ввод Вывод |
|
<string> |
Преобразование |
Передача строки |
Нет |
Да |
|
апостофа |
string на устойство |
|
|
пН |
Преобразование |
вывода |
Нет |
|
Передача следу |
Да |
|||
|
Холлерита (вывод |
ющих п символов на |
|
|
|
текстовых данных) |
устройство вывода |
|
|
TRc, |
Преобразование |
Спецификация |
Да |
Да 1 |
Тс,TLc |
позициониования |
позиции в записи |
|
|
пХ |
Преобразование |
Спецификация |
Да |
Да |
|
позициониования |
позиции в записи |
Нет |
|
p p ,ss,s Преобразование |
Управление выво |
Да |
||
|
(необязательное) |
дом знаков "плюс" |
|
|
|
знака ’’плюс" |
Установка в следую |
Да |
|
/ |
Преобразование |
Да |
||
|
слэша |
щую запись, или |
|
|
|
|
запись маркера |
|
|
|
|
"конец записи” |
|
|
\Преобразование Продолжение Нет Да(*)
|
обратного слэша |
записи |
Нет |
|
|
Прерывание |
Если в списке |
Да |
|
|
процедуры |
ввода/вывода <iolist> |
|
|
|
управления фор |
больше нет элемен |
|
|
|
матом |
тов, то выполнение |
|
|
|
|
оператора прекраща |
|
|
|
|
ется |
|
Нет |
кР |
Преобразование |
Установка показате |
Да |
|
|
коэффициента |
лей степени в |
|
|
BN,BZ |
масштабирования |
дескрипторах F и Е |
|
|
Интерпретаций |
Интерпретация |
Да |
Нет |
|
|
пробелов |
пробелов в |
|
1 |
|
|
цифовых полях |
|
|
(*) При выводе на терминал.
ся в любом направлении от текущей позиции. Этим обеспе чивается возможность многократной обработки записи при вводе.
Следует отметить, что перемещение в позицию назад более чем на 512 байт (символов) не рекомендуется.
Дескриптор преобразования Тс указывает, что указа тель текущей позиции перемещается на "с" позиций; дескрип тор TRc указывает, что указатель текущей позиции переме щается на "с” позиций вправо от текущей позиции; дескриптор TLc указывает, что указатель текущей позиции перемещается на "с" позиций влево от текущей позиции.
Если дескриптор TLc указывает позицию перед первой позицией записи, то при этом происходит перемещение в (или из) первую позицию текущей записи (или из первой позиции текущей записи).
Левая табуляция является корректной внутри записей, записываемых на устройство. Однако, если записываемая за пись длиннее, чем буфер, связанный с устройством, пользова тель не сможет сдвинуться влево в позицию, соответствующую предыдущему буферу.
Если перечисленные дескрипторы используются для пе ремещения в новую позицию, которая находится справа за последним элементом передаваемых данных, и записывается следующий элемент записи, то промежуток между концом данных в записи и новой позицией заполняется пробелами.
3.7.1.3Дескрипторы преобразования SP, SS, S
(управление выводом знака)
Дескрипторы преобразования SP, SS и S могут исполь зоваться для управления знаками (необязательными!) "плюс" в полях цифровых выходных данных. Дескриптор SP указыва ет на вывод знака "плюс" во всех позициях, где это возможно. Действие дескриптора SS является обратным действию де скриптора SP: он запрещает указание знаков "плюс" во всех позициях, которые процессором распознаются как "поля для необязательных знаков "плюс"". Дескриптор S "восстанавли вает" действие дескриптора SS (принимается по умолчанию).
3.7.1.4Обратный слэш (/)
Дескриптор (разделитель описателей полей) в виде об ратного слэша используется исключительно для форматиро вания выходных данных, выводимых на терминальные уст ройства (например, на экран или принтер). Во всех других ситуациях он игнорируется.
В общем случае, когда контроллер форматирования за вершает работу, записывается признак "конец записи". Если последним дескриптором, который встречается контроллеру, является символ обратного слэша, то признак "конец строки" не записывается; таким образом, последующие операторы ввода/вывода могут продолжать выполнять операции записи в ту же строку.
3.7.1.5Прерывание процедуры управления
форматом (:)
Дескриптор преобразования в виде двоеточия (:) преры вает выполнение процедуры управления форматом, если в списке ввода/вывода <iolist> не осталось больше данных. Дан ное свойство может быть использовано для запрещения выво да, когда некоторые из символов в формате не имеют соотвсствующих данных в списке ввода/вывода <iolist>.
Для операций ввода/вывода числовых данных исполь зуются следующие дескрипторы преобразования: I (целый), Z (шестнадцатеричный), Т (вещественный одинарной точнос ти), Е (вещественный экспоненциальный), G (вещественный с необязательной степенью), D (вещественный с двойной точ ностью) .
К числовым дескрипторам преобразования применяют ся следующие правила:
—при вводе, ведущие пробелы не являются значащими (интерпретируются как нули).Другие пробелы интерпретиру ются в зависимости от того, ’’действительны” или ”не дей ствительны” дескрипторы BN или BZ; однако поля, полностью состоящие из пробелов, всегда принимают значение 0. Знаки ’’плюс” не являются обязательными. Пробелы, добавляемые файловой системой в запись для "заполнения” до требуемого размера, также не являются значащими;
—при выводе, генерируемые символы в поле выравнивают ся справа и добавляются ведущими пробелами, при необхо димости;
—при вводе, если число выводимых символов превышает ширину поля или показатель степени превышает указанную величину, все поле заполняется звездочками. Если веществен ное число содержит больше цифр после тесятичной точки, чем допустимо в поле, то число округляется;
—при выполнении операции чтения с использованием де скрипторов I, Z, F, Е, G, D или L, поле выходных данных может содержать, в качестве символа конца поля, запятую. Чтение следующей записи будет начинаться с символа, следующего за запятой.
—неповторяющие дескрипторы преобразования могут указываться между повторяющимися дескрипторами преобра
зования.
В последующих подразделах подробно описаны некото рые повторяющиеся дескрипторы редактирования, несовпада ющие с Фортраном-66.
3.7.2.1 Дескриптор преобразования Z (преобразование шестнадцатеричных данных)
СИНТАКСИС
Дескриптор Z используется для преобразования чисел в шестнадцатеричном формате. Во время преобразования внут ренние данные обрабатываются по 4 бита (разряда). Внешние поля образуются из шестнадцатеричных символов (0-9 и A-F). Каждый байт данных соответствует двум четырехбитовым ше стнадцатеричным символам (например, ASCII символ ’т ’, представляемый в двоичном виде как 01101101, соответствует
шестнадцатеричным символам 6D).
Необязательный указатель ширины поля, w, указывает число читаемых или записываемых шестандцатеричных сим-
символы элемента списка отбрасываются и устанавливаются ’’хвостовые” пробелы.
Если число входных символов не равно w, тогда входное поле заполняется пробелами или усекается справа до длины,
равной значению w; это выполняется до того, как будет пере даваться элемент списка <iolist>.
При выводе, если значение параметра w превышает чис ло символов, обеспечиваемых элементом списка <iolist>, то будут указываться ведущие пробелы; в противном случае бу дут выводиться w "самых левых" символов элемента списка .
3.7.3Взаимодействие спецификации формата
исписка ввода/вывода
Если выполняется операция чтения записи, в которой общее число символов во входной записи меньше общего числа записей, специфицированных дескрипторами преобразования и списком <iolist>, то возможны следующие два варианта:
—запись будет добавлена пробелами справа до требуемой длины;
—любые вводимые пользователем пробелы будут интерп ретироваться "согласно действию”, выполняемому при ука зании дескриптора BN или BZ. ^
Если контроллер формата встречает дескриптор преоб разования в виде двоеточия (:), а в списке <iolist> элементов больше не указано, то он прерывает выполнение операции ввода/вывода;
Если контроллер формата встречает дескриптор преоб разования в биде двоеточия *(:), а в списке <iolist> еще имеются элементы, тогда дескриптор (:) игнорируется;
Повторный просмотр не изменяет ранее сделанных ус тановок коэффициента масштабирования и не отменяет дей ствия дескрипторов BN или BZ.
Когда контроллер формата прерывает выполнение опе рации ввода, оставшиеся в записи символы пропускаются.
Когда контроллер формата прерывает выполнение опе рации вывода, записывается признак ’’конец-записи”, если, однако, в "прерываемом” файле не был указан разделитель описателей полей - дескриптор преобразования в виде обрат
ного слэша.
Для устройств (файлов), присоединенных к терминаль ным устройствам, признак "конец-строки" не записывается до тех пор, пока следующая запись не начнет записываться на устройство. Если устройством является экран, то для запре щения признака "конец-строки” можно использовать раздели тель описателей полей в виде обратного слэша.
3.8Ввод/вывод, управляемый списком
"Запись, управляемая списком” представляет собой по следовательность значений и разделителей значений. Каждое значение должно быть одним из следующих:
—константой, необязательно умноженной на ненулевую целочисленную константу без знака.
4 Заказ № |
49 |
—пустым значением (null), необязательно умноженным на
ненулевую целочисленную константу без знака.
Ни одно из них, за исключением строковых констант, нс может содержать встроенных пробелов.
Разделители значений могут быть следующие:
—запятая (,); —символ слэша (/). Слэш, указанный как разделитель зна
чений, во время выполнения оператора ввода, управляемого списком, останавливает выполнение этого оператора после присвоения предыдущего значения. Любые последующие эле менты в списке входных данных обрабатываются как пустые
значения; —один или более последовательных пробелов между двумя
константами или после последней константы. Пробелы, следу ющие за разделителями пробелов, игнорируются.
ПРИМЕЧАНИЕ Ввод/вывод, управляемый списком, в или из внутрен
них файлов запрещен стандартом ANSI.
3.8.1Ввод, управляемый списком
В большинстве случаев все форматы ввода, допустимые
для форматного ввода/вывода, также допустимы и для фор матирования, управляемого списком. В данном подразделе
рассмотрены исключения из этого правила.
Следующие правила применимы для управляемого
списком ввода любых значении:
—формат входного значения должен быть допустимым для типа элемента списка входных данных;
—пробелы всегда обрабатываются как разделители, но
не как нули; —встроенные пробелы могут использоваться только
внутри символьных констант. Следует отметить, что признак "конец-записи” имеет такое же действие, что и пробел, за исключением случая, когда он указан внутри символьной кон станты. В приведенном ниже списке представлены ограни чения и исключения из перечисленных выше правил:
1 .Вещественные константы одинарной или двойной точности должны быть "числовыми входными полями", т.е. полями, "пригодными" для преобразования с использованием дескриптора F. Предполагается, что они не должны иметь дробной части, если, однако, внутри поля не указана деся тичная точка.
2. Комплексные константы являются упорядоченной парой вещественных или целочисленных констант, разделен ных запятой и заключенных в круглые скобки. Первая кон
станта пары есть действительная часть комплексной констан ты; вторая - мнимая ее часть.
3.Логические константы не могут содержать ни слэши, ни запятые среди необязательных символов^ разрешенных для дескриптора L.
4.Символьные константы представляют собой непу стые строки символов, заключенные в одинарные кавычки