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

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

iar = 3*5, 2*10

аналогично следующему: iar = 5, 5, 5, 10, 10

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

В случае неименованного списка операторы В/В имеют вид: WRITE(u, [FMT =] *) [список вывода]

PRINT * [, список вывода] READ(u, [FMT =] *) [список ввода] READ * [, список ввода]

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

*- указывает на то, что В/В будет управляться списком В/В.

Список В/В формируется по тем же правилам, которые действуют и при форматном В/В.

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

При управляемом неименованным списком вводе действуют правила:

ввод выполняется из последовательных текстовых файлов, внутренних файлов или с клавиатуры;

поле ввода

содержит константу (или повторяющуюся константу),

тип которой должен соответствовать элементу списка ввода, например:

real a, b, c

 

 

 

 

read(*, *) a, b, c

 

 

 

 

write(*, *) a, b, c

!

1.440000

1.440000

1.440000

Введем, например:

7*1.44

в случае ввода числовых значений пробелы всегда обрабатываются как разделители между полями; ведущие пробелы перед первым полем записи игнорируются;

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

допустимо использовать запятую в качестве разделителей между полями ввода;

при наличии между полями ввода слеша (/) ввод прекращается и все последующие элементы списка ввода не изменяют своих значений. При задании констант полей ввода следует придерживаться правил:

вещественные константы одинарной или двойной точности должны быть числовыми входными полями, т. е. полями, пригодными для преобразования с использованием дескриптора F;

323

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

комплексные константы являются упорядоченной парой вещественных или целочисленных констант, разделенных запятой и заключенных

в круглые скобки;

логические константы содержат обязательные символы T (t) или F (f), перед которыми может быть проставлена необязательная точка. Далее могут следовать необязательные символы. Так, символы T, или .t, или tru, или T1, или .t1, или .T44, или .true. могут быть использованы для представления логической константы .TRUE.;

символьные

константы задаются строками символов, заключенных

в апострофы

(') или кавычки ("). Каждый ограничитель внутри

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

character(80) st

 

read(*, *) st

 

write(*, *) st

! Line1 - next line and last line

Введем:

'Line1

- next line and last line'

Символьная константа может быть также задана и без ограничителей, но в таком случае константа не может включать символы-разделители: пробелы, запятые, символы конца строки, слеши. Также невозможно разместить такую константу на нескольких строках;

если длина символьной константы меньше или равна длине вводимого элемента, то будут введены все символы константы, невведенные символы будут заполнены пробелами. Если же длина символьной константы больше длины n вводимого элемента, то будут введены первые n символов константы;

задание производного типа выполняется путем перечисления значений для его компонентов в порядке, который задан при объявлении производного типа.

Поля ввода содержат пустые (null) значения, если:

между двумя последовательными разделителями полей ввода символы не указаны, например: 11.1, , ,12.2;

перед первым разделителем в записи символы не указаны;

задана повторяющаяся константа с пустым значением, например задание 7* эквивалентно заданию 7 полей ввода с пустыми значениями.

324

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

Если элементу списка ввода соответствует null-поле, то значение элемента в результате выполнения оператора ввода не меняется.

Пробелы рассматриваются как часть разделителя за исключением:

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

ведущих пробелов первой записи, если только сразу после них не следует запятая или слеш (/).

Пример:

complex :: z = (1, 2) real :: a = 3.3, b = 2.2 logical :: fl = .true. character(30) :: st = 'ab'

read(*, *) z, a, b, m, n, fl, st

write(*, *) z, a, b, '\n\r'c, m, n, fl, ' ', st

Введем:

, 1.1 , , , 3 /

Результат:

(1.000000,2.000000) 1.100000 2.200000

03 T ab

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

Вывод под управлением неименованного списка выполняется так:

вывод осуществляется в последовательные текстовые файлы, внутренние файлы, на экран или принтер;

длина создаваемой при выводе записи не превышает 79 символов. Если же для размещения элементов вывода требуется большее число символов, то создаются новые записи. В конце каждой записи проставляются символы конца записи: CHAR(13) и CHAR(10);

символьные данные по умолчанию выводятся без ограничителей, однако после задания в операторе OPEN спецификатора DELIM = 'QUOTE' или DELIM = 'APOSTROPHE' вывод символьного значения выполняется с ограничителями: кавычками или апострофами. При этом если в символьной величине есть ограничители, то они будут удваиваться;

вывод объекта производного типа выполняется покомпонентно в порядке появления компонентов в объявлении производного типа.

Управляемый неименованным списком вывод данных различных типов выполняется в соответствии с приведенными в табл. 9.8 ДП, которые, как видно из таблицы, различаются в CVF и FPS.

Таблица 9.8. Дескрипторы преобразований для вывода под управлением неименованного списка

Типы данных

CVF

FPS

325

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

LOGICAL(1),

L2

 

L1

LOGICAL(2),

выводится:

T для .TRUE.,

выводится: T для .TRUE.,

LOGICAL(4)

 

F для .FALSE.

F для .FALSE.

 

 

 

 

BYTE,

I5

 

I11

INTEGER(1)

 

 

 

INTEGER(2)

I7

 

I11

INTEGER(4)

I12

 

I11

 

 

 

 

REAL(4)

1PG15.7E2

 

F15.6 ( 1 val < 107)

 

 

 

E15.6E2 (val < 1 или val 107)

REAL(8)

1PG24.16E2

 

E24.15 (1 val < 107)

 

 

 

E24.15E3 (val < 1 или val 107)

CHARACTER(w)

1X, Aw

 

Aw

 

 

 

 

В таблице использованы следующие обозначения:

- пробел;

val - выводимая величина;

w - размер символьной строки. Пример 1. Вывод "длинной" константы:

character :: sub*10 = '1234567890', st*150 = ' ' do 1, i = 1, 15

1 st = trim(st) // sub write(*, *) st

Пример 2. Сравнение выводов CVF и FPS:

character(3) :: st = 'abc'

 

 

print *, st

! CVF:

abc

 

! FPS:

abc

print '(a3)', st

! CVF:

abc

 

! FPS:

bc

Разница при форматном

выводе

строки объясняется тем, что в CVF

по умолчанию CARRIAGECONTROL равен 'LIST', а в FPS - 'FORTRAN'.

Замечание. Для управления выводом можно использовать СИ-символы: '\n'c - новая строка, '\r'c - возврат каретки, '\t'c - табуляция и др. (разд. 3.5.5). Например:

character(4) year(5) /'1998', '1999', '2000', '2001', '2002'/ write(*, *) 3.55, '\t'c, 'pels', '\n\r'c, (year(i),' ', i = 1,5)

Результат:

3.550000 pels

1998 1999 2000 2001 2002

326