Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Fortran для персонального компьютера

..pdf
Скачиваний:
22
Добавлен:
15.11.2022
Размер:
12.5 Mб
Скачать

3.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.Символьные константы представляют собой непу­ стые строки символов, заключенные в одинарные кавычки