Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
современный фортран , Бортеньев.pdf
Скачиваний:
272
Добавлен:
26.03.2015
Размер:
2.34 Mб
Скачать

О. В. Бартеньев. Современный ФОРТРАН

12.340

12.340

12.340

12.340

12340.000 12340.000

12340.000

12340.000

Интерпретация пробела в числовых полях управляется ДП BN и BZ. Дескриптор BN игнорирует пробелы: в поле выбираются все отличные от пробелов символы и выравниваются по правой границе. Так, в случае

применения BN поля -1

.23 и

-1.23 эквивалентны.

Дескриптор BZ идентифицирует все пробелы поля как нули. Так, в

случае BZ поля 1

.2

3 и 100.203 эквивалентны.

Замечание. Пробелы, следующие после E или D, при вводе вещественных чисел всегда игнорируются, независимо от вида примененного дескриптора интерпретации пробелов.

По умолчанию первоначально операторы В/В интерпретируют пробелы в соответствии с дескриптором BN, если только в операторе OPEN не задан спецификатор BLANK = 'NULL' | 'ZERO'.

Если задан дескриптор BZ, то он будет действовать до тех пор, пока не будет обнаружен дескриптор BN.

9.9. Управляемый списком ввод/вывод

При управляемом списком В/В все преобразования выполняются с учетом типа элементов списка В/В и значений передаваемых данных в соответствии с принятыми в Фортране соглашениями.

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

Различают два вида управляемого списком В/В: управляемый именованным и неименованным списком.

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

9.9.1. Управляемый именованным списком ввод/вывод

Синтаксис В/В под управлением именованного списка: WRITE(u, [NML =] имя списка В/В)

READ(u, [NML =] имя списка В/В)

u - устройство В/В (см. разд. 10.2).

имя списка В/В - задается оператором NAMELIST.

Спецификатор NML может быть опущен. Его присутствие обязательно, если заданы другие спецификаторы оператора WRITE или READ, например

END.

Управляемый списком В/В удобен на этапах отладки и тестирования программы, когда часто нужно вывести имена переменных и их значения.

318

9. Форматный ввод/вывод

9.9.1.1. Объявление именованного списка

Оператор NAMELIST объявления именованного списка В/В должен появляться в разделе объявлений программной единицы и имеет вид:

NAMELIST / имя списка В/В / список переменных

&

[/ имя списка В/В / список переменных ...]

 

имя списка В/В - имя списка переменных. Одно и то же имя списка В/В может появляться в операторе NAMELIST неоднократно. В этом случае соответствующие именам списки переменных рассматриваются как один список. Порядок расположения элементов в таком списке соответствует их расположению в операторе NAMELIST.

список переменных - список имен переменных, может содержать переменные производного типа, которые, правда, не должны в качестве компонентов иметь ссылки. Формальные параметры не могут быть элементами списка. Также элементами списка не могут быть подобъекты (сечения массивов, подстроки...). Одно и то же имя может появляться более чем в одном списке переменных.

Оператор NAMELIST присваивает имя списку переменных. Далее это имя используется в операторах В/В. Например:

integer :: ia = 1, ib = 2

complex :: z(2) = (/ (2.0, -2.0), (3.5, - 3.5) /)

namelist /ico/ ia, ib, z

! Объявляем именованный список

write(*, ico)

! Выводим именованный список на экран

9.9.1.2. NAMELIST-вывод

При выводе именованного списка результат имеет вид:

&имя_списка_вывода имя переменной = значение | список значений

...

имя переменной = значение | список значений

/

Пример:

integer :: k, iar(5) = (/ 41, 42, 43, 44, 45 /) logical :: fl = .true.

real :: r4*4 = 24, r8*8 = 28 complex(4) :: z4 = (38.0, 0.0) character(10) :: c10 = 'abcdefgh' type pair

character(1) a, b end type pair

type(pair) :: cp = pair('A', 'B')

namelist /mesh/ k, fl, r4, r8, z4, c10, cp, iar k = 100

write(*, mesh)

319

О. В. Бартеньев. Современный ФОРТРАН

Результат:

&MESH

K =

100

FL = T

R4 =

24.000000

R8 =

28.000000000000000

Z4 =

(38.000000,0.000000E+00)

C10 = abcdefgh

CP =

A B

IAR =

41 42 43 44 45

/

 

Из примера видно, что символьные данные выведены без обрамляющих кавычек. При необходимости можно вывести строку с обрамляющими кавычками или апострофами. Для этого текстовой файл (или последовательное устройство, например экран) надо открыть с DELIM = 'APOSTROPHE' или DELIM = 'QUOTE', которые задают вид ограничителя символьных данных: апостроф (') или кавычки ("). При NAMELIST-выводе в файл, открытый, например, с DELIM = 'APOSTROPHE', выводимые символьные данные ограничиваются апострофом, а присутствующие в строке апострофы удваиваются. Аналогичное влияние оказывает спецификатор DELIM = 'QUOTE'. Отсутствие в операторе OPEN спецификатора DELIM эквивалентно заданию в нем спецификатора DELIM = 'NONE'.

Пример:

integer :: k = 100

 

character(10) :: c10 = 'abcd"efgh'

 

type pair

 

character(1) a, b

 

end type pair

 

type(pair) :: cp = pair('A', 'B')

 

namelist /mesh2/ k, c10, cp

 

open(10, file = 'a.txt', delim = 'quote')

 

write(10, mesh2)

! Вывод в файл a.txt

open(6, delim = 'quote')

! Изменяем свойства подсоединения

write(6, mesh2)

! Вывод на экран

Результат (кавычки внутри строки C10 удваиваются):

&MESH2

 

K =

100

 

C10 = "abcd""efgh"

 

CP =

"A""B"

 

/

 

 

320

9. Форматный ввод/вывод

9.9.1.3. NAMELIST-ввод

Ввод именованного списка практически зеркально противоположен его выводу.

При вводе именованного списка оператор ввода ищет в файле начало списка, которое может иметь вид: &имя_списка или $имя_списка. Перечень принадлежащих именованному списку данных завершается слешем (/) или знаком доллара ($) или амперсанда (&). После знаков доллара и амперсанда может следовать слово END. Каждый элемент ввода имеет вид:

имя_переменной = значение | список значений

имя_переменной (хотя в NAMELIST могут присутствовать только полные объекты) может при вводе быть и подобъектом - сечением или элементом массива, подстрокой, компонентом записи...

Пример:

&eli k = 1

/

 

 

 

$eli k = 1

$

или $eli k = 1 $end

&eli k = 1

&

или

&eli k = 1

&end

$eli k = 1

&end

или

&eli k = 1

$end

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

Пример:

integer :: k, iar(5) logical :: fl

real r4 complex z4

character :: c10*10, c4*4

namelist /mesh/ k, fl, r4, z4, c10, c4, iar open(1, file = 'a.txt')

read(1, mesh) write(*, *) k, iar, fl

write(*, *) r4, z4, ' ', c10, ' ', c4

Состав файла a.txt:

&Mesh K = 100, FL = T, Z4 = (38, 0), C10 = 'abcdefgh' r4 = 24.0, iar = 1, 2, 3, 5, 5, c4 = 'sub'

/

321

О. В. Бартеньев. Современный ФОРТРАН

Результат:

100

1

2

3

5

5

T

 

24.000000

(38.000000,0.000000E+00)

abcdefgh

sub

Замечание. Именованный, предназначенный для ввода список с данными теперь, согласно стандарту 1995 г., может содержать комментарий, следующий, как и в исходном коде, после восклицательного знака, например:

Состав файла a.txt:

&Mesh K = 100, FL = T, Z4 = (38, 0),

! Задание числовых данных

C10 = 'abcdefgh'

! Значение символьной переменной

r4 = 24.0, iar = 1, 2, 3, 5, 5 /

 

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

Для задания логической величины в файле следует указать T или

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

удвоены.

Пример:

integer :: iar(5) = 100 logical fl character(10) st

namelist /mesh2/ iar, fl, st open(1, file = 'a.txt') read(1, mesh2)

write(*, *) iar, fl, ' ', st

Состав файла a.txt (в файле заданы подобъекты массива iar, причем элементам iar(1) и iar(3) соответствуют значения):

&Mesh2

st = 'ab d''ef gh'

 

 

iar(1:4) = , -2, , -4, iar(5) = 55, fl = .False.

&end

 

 

 

 

Результат:

 

 

100

-2

100

-4

55 F ab d'ef gh

 

 

 

Замечание.

Повторяющиеся

значения списка значений можно записать

в виде одного значения, проставив перед ним коэффициент повторения, после которого следует звездочка (*). Например, задание:

322