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

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

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

Спецификатор внешнего устройства должен быть либо целочисленным выражением, либо звездочкой (*). Значение целочисленного выражения должно находится в диапазоне от О до 32.767.

Спецификатор устройства звездочка (*) является’’зара­ нее присоединенным и не может быть "присоединен” к фай­ лам при помощи оператора OPEN. Данный спецификатор яв­ ляется единственным спецификатором, который не может быть переназначен для другого файла. Спецификатор устрой­ ства звездочка указывает клавиатуру при чтении файла и эк­ ран при записи.

В языке ФОРТРАН определены четыре "заранее присо­ единенных" внешних устройства:

—звездочка(*) всегда представляет клавиатуру или экран, —О начально представляет клавиатуру или экран, —5 начально представляет клавиатуру, —6 начально представляет экран .

Устройство, определенное как звездочка (*), не может

быть определено для любого другого файла, а попытка "за­ крыть" такое устройство вызовет ошибку компиляции. Уст­

ройства 0, 5 и 6, однако, могут быть присоеденены к любым файлам при помощи оператора OPEN. Если пользователь "за­ крывает" устройство 0,5 или 6, то оно автоматически переназ­ начается клавиатуре и экрану, клавиатуре или экрану, соот­ ветственно. При чтении или записи на устройство, которое в данный момент отсоеднинено, файл открывается неявно (см. подразд.4.6.1).

3.2.3Метод доступа к файлу (параметр ACCESS=)

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

3.2.3.1Последовательный метод доступа

Последовательный файл содержит записи, упорядочен­ ные в той последовательности, как они записывались в файл.

Ко всем внутренним файлам применяется последова­ тельный доступ. Последовательный доступ применим также к файлам, ассоциированным с "последовательными устройст­ вами", т.е. такими устройствами, для которых допустимы только операции чтения и записи. "Последовательными уст­ ройствами' являются клавиатура, экран, принтер.

Следует помнить, что операции прямого доступа для файлов, открытых для последовательного доступа, не разре­ шены. Существующий последовательный файл может быть открыт в режиме ’APPEND’. При этом файл немедленно пози­

ционируется после последней записи перед маркером "конецфайла

3.2.3.2Метод прямого доступа

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

ваются в любой последовательности.

Файл прямого доступа должен постоянно находится на диске. Связывать файл прямого-доступа с последовательным устройством (клавиатурой, экраном или принтером) нельзя.

Записи располагаются последовательно, начиная с пер­ вой, для которой указывается номер 1. Все записи имеют оди­ наковую длину, указываемую параметром RECL= в операторе

Одна запись записывается для каждого неформатного оператора READ или WRITE. Форматные операторы READ и WRITE могут передавать более одной записи, используя дес­ криптор редактирования в виде символа прямого слэша (/).

За исключением двоичных файлов, количество байт, записываемых в запись, должно быть меньше или равно длине записи. Для двоичных файлов единственный оператор READ или WRITE может читать или записывать столько записей, сколько их требуется для обеспечения соответствия количест­ ву передаваемых байтов.

При выводе данных неполные форматные записи допол­ няются пробелами. Неполные неформатные и двоичные за­ писи дополняются неопределенными байтами (нулями).

Если запись записывается за пределами ранее назначен­ ного признака конца файла, то операционная система будет пытаться расширить файл прямого доступа. Однако выпол­ нение такой операции возможно только при наличии достаточ­ ного свободного места на физическом устройстве.

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

Удалить однажды записанную запись не представляется

возможным; однако, запись может быть "перезаписана" с но­ вым значением.

Каждая операция READ или WRITE для файла прямого доступа должна явно задавать запись, к которой выполняется доступ. Однако следует отметить, что в языке ФОРТРАН фирмы Microsoft для файлов, открытых как файлы прямого доступа, допустимы также и "последовательные" операции.

Одним из способов управления размером программы и скоростью ее исполнения является использование параметра BLOCKSIZE в операторе OPEN. Значением параметра BLOCKSIZE является целочисленное выражение, указываю­ щее размер внутреннего буфера, используемого при выпол­ нении операций ввода/вывода. Поскольку специфицирован­ ный размер блока обычно округляется до размера следующего блока, параметр BLOCKSIZE= в операторе INQUIRE предо-

3.2.5Список дескрипторов преобразования

Списки дескрипторов преобразования задают и описы­ вают Формат данных. Они используются в операторах FORMAT и спецификаторах формата.

Список дескрипторов преобразования (включая внеш­ ние скобки) представляет собой символьную константу и за­ ключается в апострофы при его указании в операторах READ и WRITE. В версии языка ФОРТРАН фирмы Microsoft список дескрипторов преобразования может быть заключен в кавыч­ ки. При указании списка дескрипторов в операторе FORMAT апострофы не задаются.

Список представляет собой последовательности фор­ матных дескрипторов, разделенных запятыми. Пользователь может опустить запятую между двумя элементами списка, если результирующий список при этом не станет ’двусмыслен­ ным . Например, пользователь может опустить запятую после дескриптора^ или перед или после символа слэша (/).

В списке дескрипторов преобразования допустимо до 16 уровней встроенных круглых скобок.

Следует отметить, что каждый форматный оператор WRITE в качестве символа "управления кареткой" записывает на терминальное устройство символ пробела.

3.2.6 Управление ошибками и концом файла (параметры IOSTAT=, ERR=, END=)

Если во время выполнения оператора ввода/вывода встретится ошибочная запись или запись "конец файла", то в зависимости от наличия и описания параметров ERR=<errlabel>, IOSTAT=<iocheck>, END=<endlaoel> будет выполнено соотвествующее действие. Следует отметить, что при обнаружении записи "конец файла", она будет обрабаты­ ваться как ошибка каждого оператора-ввода/вывода, кроме оператора READ.

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

Втаблице 3.3 показано, какие действия выполняются, когда в операторе READ встречается запись "коней файла" или Ошибочная запись. Следует отметить, что в любой момент, Когда в операторе READ встречается ошибка, все элементы в Списке ввода/вывода <editlist> становятся неопределенными.

Втаблице 3.4 показано, что происходит при возникно­ вении ошибки (включая запись "конец файла") во время вы­ полнения любого оператора ввода/вывода, отличного от опе­ раторов READ или PRINT:

Если выполнение оператора ввода/вывода прерывается,

Эошибочная запись или запись ' конец файла" не встретилась,

 

Таблица 3.4

Ситуация

Результат

Не указан ни

Выполнение программы прерывается, выда­

<errlabel>, ни

ется сообщение об ошибке этапа исполнения

<iocheck>

Управление передается в оператор, указан­

Указан только

<errlabe!>

ный в <errlabel>

Указан только

Значение <iocheck устанавливается в зна­

чение положительного целого и управление

<iocheck>

передается'(возвращается) таким образом,

 

как если бы оператор выполнился без

 

ошибки

Указаны и

Значение <iocheck устанавливается в зна­

<errlabel> и чение положительного целого и управление

<iocheck>

передается в оператор, указанный в

 

<errlabef>

вания, специфицируемый в операторе FORMAT, может использоваться для форматирования выходных или входных данных.

3.2.7.2Имя целочисленной переменной

Для установления "взаимосвязи' целочисленной пере­ менной и метки оператора FORMAT может быть использован оператор ASSIGN. 6 дальнейшем целочисленная переменная может использоваться как спецификатор формата, например:

ASSIGN <label> ТО <var> <label> FORMAT*. . .)

WRITE (*,<var>)

В операторе WRITE имя целочисленной переменной <var> относится к метке <label> оператора FORMAT; назна­ чение выполнено непосредственно перед использованием опе­ ратора FORMAT.

3.2.7.3Символьные выражения

Список дескрипторов преобразования может быть задан как символьное выражение, которое в свою очередь может быть использовано как спецификатор формата.

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

3.2.7.4Символьная переменная

Список дескрипторов преобразования может быть запи­ сан как символьное выражение; это выражение может быть присвоено символьной переменной. Затем символьная пере­ менная может использоваться как спецификатор формата.

3.2.7.5Звездочка (*)

Когда в качестве спецификатора формата используется звездочка (*), тогда выполняется операция ввода/вывода, уп­ равляемая списком, например:

WRITE (о,*) ’ Пример вывода : i = \i, х = \х

В данном примере вторая звездочка указывает на ввод/вывод, управляемый списком. Символьные строки, за­ данные в апострофах выведутся без изменений, переменная целого типа соответственно формату In, где п - длина значения переменной, переменная действительного типа х - в соответ­ ствии с форматом G14.7

3.2.7.6Имя символьного или несимвольного

массива

Список дескрипторов преобразования может быть задан как символьное выражение; это выражение может быть назна­ чено массиву. В дальнейшем массив может использоваться как

спецификатор формата Массив интерпретируется таким образом, как если бы

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

Несимвольный массив также может быть специфициро­ ван как массив, в котором элементы обрабатываются как эк­ вивалентные символьные переменные одинаковой длины.

Если для спецификации списка используется константа Холлерита, то список не может содержать дескриптор преоб­ разования в виде апострофа или дескриптор преобразования

3.2.7.7Элемент символьного массива

Список дескрипторов преобразования может быть задан как символьное выражение; это выражение может быть назна­ чено элементу символьного массива. В дальнейшем элемент символьного массива может быть использован в качестве спецификатора формата.

3.2.8Спецификатор списка именования

(параметр NML=)

Внутри оператора WRITE спецификатор списка имено­ вания предписывает именам и значениям всех переменных в списке именования записываться на заданное устройство.

Внутри оператора READ спецификатор подсказывает" пользователю о необходимости ввода значений для одного или нескольких переменных в списке именования. Дополнитель­ ные сведения приведены в подразд.3.9.

3.2.9Структура файла (параметр FORM=)

Структура файла зависит от метода доступа к файлу, определяемого параметром ACCESS= (см. подразд.3.2.3), и формата данных в файле. Файл может быть структурирован одним из следующих трех способов:

1. Форматный ^formatted’ : Файл представляет собой последовательность форматированных записей. Форматиро­ ванными записями являются группы символов ASCII, окан­ чивающиеся маркером "конец-записи".

Записи в форматном последовательном файле могут быть разной длины. Все записи в форматном файле прямого

доступа должны иметь одинаковую длину. Все внутренние файлы должны быть форматными?

2. Неформатныи ^unformatted’: Файл представляет бой последовательность неформатных записей. Неформатные записи представляют собой последовательность значений.

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

Неформатные файлы последовательного доступа также (дополнительно ! ) содержат информацию, указывающую на границы длины каждой записи.

3. Двоичный ’binary’: Двоичные файлы последовате ного доступа представляют собой последовательности байтов, не имеющих внутренней структуры. В файле такого типа нет записей как таковых. Файл содержит лишь информацию, спе­ цифицируемую как список элементов ввода/вывода в опера­ торах WRITE, в которых есть ссылки на этот файл.

Двоичные файлы прямого доступа имеют очень простую структуру. Длина записи назначается параметром RECL= опе­ ратора OPEN. Таким образом задаются границы записей, ко­ торые используются только для репозиционирования и добав­ ления записей до и после выполнения операций чтения и записи и во время выполнения операций BACKSPACE. Эти границы записей, однако, не ограничивают число байтов, KOJ торые могут быть переданы во время выполнения операций чтения или записи.

Если во время выполнения операции ввода/вывода бу­ дет предпринята попытка считать или записать больше зна­ чений, чем содержится в записи, то операция чтения или за­ писи будет продолжена в следующей записи.

3.2.10Список ввода/вывода

Список ввода/вывода,<iolist>, специфицирует входные и выходные данные (см. также подразд.3.7.3, где описано, ка­ ким образом взаимосвязаны списки <iolist> и <editlist>). В списке ввода/вывода <iolist> могут указываться следующие

элементы:

—Элемента нет (пустой список). Результирующая запись либо имеет нулевую длину, либо состоит только из символов дополнения:

—Имя переменной, имя элемента массива, имя символь­ ной подстроки, либо имя элемента структуры. Эти элементы указывают, что переменная, элемент массива, символьная подстрока или элемент структуры будут вводиться или вы­

водиться:

—Имя массива. Имя массива специфицирует все элементы в последовательности возрастания (номеров) столбцов (см. также подразд.4.2 где описано, каким образом массивы разме­

щаются в памяти):

—Любое выражение. Список выходных данных в операто­ рах WRITE и PRINT может содержать произвольные выра­ жения, такие как числовые, логические или символьные.

—Список встроенных операторов DO. Списки данного типа имеют следующую форму:

(<iolist>,<dovar>=<start>,<stop> [,<inc> ])

В данном случае, список ввода/вывода <iolist> является списком входных или выходных данных (и может содержать любые элементы этого списка, включая другой список встро­ енных операторов DO). Элементы списка данного типа явля­ ются аналогами операторов внутри обычных DO-циклов.

3.2.11 Совместное использование файлов

(параметры MODE=,SHARt=)

В системах, допускающих многозадачность или исполь­ зующих сетевую обработку, к одному и тому же файлу однов­ ременно могут обращаться несколько программ. Для управ­ ления доступом к файлу в этом случае, используются два параметра оператора OPEN: MODE= и SHARE-. Эти парамет­ ры также используются в операторе INQUIRE, так что поль­ зователь может определять статус доступа к файлу.

Значение параметра MODE=<mode> определяет каким образом первый процесс, открывающий этот файл, может ис­ пользовать данный файл. Пользователь может выбрать режим чтения файла (’READ’), записи файла (’WRITE’) или оба варианта (’READWRITE*).

Параметр SHARE=<share> устанавливает каким обра­ зом последующий процесс имеет возможность обратиться к данному файлу (т.е. когда этот файл уже открыт). Пользова­ тель может выбрать режим чтения файла CDENYWR’), за­ писи файла (’DENYRD’), оба варианта (’DENYNONE’) или отказываться от данной возможности (’DENYRW’). Можно также выбрать режим, при котором доступ к файлу (кроме того процес^^юэто^ыйего открыл) будет запрещен для всех про-

В таблице 3.5 показаны ограничения на открытие фай­ ла, который уже является открытым (указаны конкретные значения <mode> и <share> для этого файла).

3.2.12Номер записи (параметр REO )

Параметр REC=<rec> используется для спецификации номера конкретной записи.

 

Таблица 3.5 Параметры MODE и SHARE

1

Оригинальный процесс

Параллельный процесс

|

MODE=

SHARE=

MODE=

SHARE=

’READWRITE’ ’COMPAT’ ’READWRITE’’COMPAT’ толь­

’READ’

 

’READ’

ко оригиналь­

’WRITE’

 

’WRITE’

ным процессом

’READWRITE’ ’DENYRW’

Файл может

 

’READ’

 

быть открыт

 

’WRITE’

 

параллельным

 

 

 

процессом

 

’READWRITE’ ’DENYWR’

’READ’

’DENYNONE’

’READ’

’DENYWR’

’READ’

’DENYNONE’

 

 

 

’DENYWR’

’WRITE’

’DENYWR’

’READ’

’DENYNONE’

 

 

 

’DENYRD’

’READWRITE’ ’DENYRD’

’WRITE’

’DENYNONE’

’READ’

’DENYRD’

’WRITE’

’DENYNONE’

 

 

 

’DENYWR’

’WRITE’

’DENYRD’

’WRITE’

’DENYNONE’

 

 

 

’DENYRD’

’READWRITE’’DENYNONE ’READWRITE’ ’DENYNONE’

 

У

’READ’

 

 

 

 

 

 

’WRITE’

 

’READ’

’DENYNONE ’READWRITE’ ’DENYNONE’

 

>

’READ’

’DENYRD’

 

 

’WRITE’

 

’WRITE’

’DENYNONE ’READWRITE’ ’DENYNONE’

 

У

’READ’

’DENYRD’

 

 

’WRITE’

В операторе LOCKING параметр <гес> указывает на то, защищена или не защищена первая запись.

Воператорах READ и WRITE, параметр <гес> указывает на то, читается или записывается первая запись. Первая за­ пись в файле является записью с номером 1.

3.3Выбор типов файлов

Для создания различных типов файлов пользователь может комбинировать свойствами разрешенных для использо­ вания файлов. Различают два общих типа файлов:

1. Последовательные форматные файлы, "присоединен­

ные" к устройству, помеченному звездочкой (*) (такое устройг ство представляет клавиатуру или экран). Следует отметить, что при чтении с устройства, отмеченного звездочкой (*) (с клавиатуры), пользователь должен завершать каждую строку

нажатием клавиши ENTER. Для исправления ошибок ввода следует применять и следовать соглашениям, принятым в испольэуемой операционной системе.

Поименованные последовательные форматные внешние

Тип используемою пользователем файла зависит от ре­ шаемой прикладной задачи.

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

rhn^^DAиДОСтуп к данным пользователя разрешен только из ФУР I РАНа и особое значение имеет скорость доступа, то

доступ к двоичным и неформатным файлам выполняется быс­ трее, чем доступ к форматным файлам

Если данные должны передаваться без предваритель­ ной системной интерпретации, тогда наиболее "практичными" для использования будут двоичные или неформатные файлы ^ Если все 256 возможных значений байтов должны оыть передаваемыми, необходимо использовать двоичный или неформатный ввод/вывод.

Если необходимо управлять устройством с однобайто­ вым (двоичным) интерфейсом, следует использовать двоич­ ный или неформатный ввод/вывод. В этой ситуации формат­ ный ввод/вывод интерпретирует некоторые символы, вместо передачи их в программу без изменения. Предпочтительнее

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

Если данные должны передаваться без какой-либо системной интерпретации и должны читаться программами, не являющимися ФОРТРАН-программами, рекомендуется использовать двоичный формат. Неформатные файлы являются внутренне блокируемыми", так что прогоаммы, не яв­ ляющиеся ФОРТРАН-программами, должны быть совмести­ мы с данным форматом для корректной интерпретации

данных. Двоичные файлы содержат только те данные, которые в них записаны

„ Если пользователь читает файл, созданный програм­ мой, написанной на другом языке (не на ФОРТРАНе), реко­ мендуется использовать двоичный ввод/вывод. Не-ФОРТ-

m

n

Лы ь,чн° имеют структуру, отличную от структуры

фи/

1

-файлов. Двоичный файл прямого доступа, откры-

 

е параметром REC=1, например, очень похож" на потоко-

ыи файл в библиотеке Си. Пользователь может "перемес-

в П03ИЦИЮ в файле и прочитать произвольную оследовательность значений. Неполные записи не вызывают

появления неопределенных значений, т.к. размер записи ра-