Главная страница
Навигация по странице:

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

  • 9.9.1.2. NAMELIST-вывод

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

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

  • современный фортран , Бортеньев. О. В. Бартеньев Современный Фортран


    Скачать 2.24 Mb.
    НазваниеО. В. Бартеньев Современный Фортран
    Анкорсовременный фортран , Бортеньев.pdf
    Дата28.05.2018
    Размер2.24 Mb.
    Формат файлаpdf
    Имя файласовременный фортран , Бортеньев.pdf
    ТипДокументы
    #19729
    страница35 из 49
    1   ...   31   32   33   34   35   36   37   38   ...   49
    316

    9. Форматный ввод/вывод следующий оператор вывода продолжит передачу данных в ту же запись, начиная с той позиции, в которой файл был оставлен последним оператором вывода.
    Такое же действие оказывает и дескриптор $, а также спецификатор оператора В/В ADVANCE = 'NO', который, правда, в отличие от дескрипторов \ и $ применима и при вводе. Дескрипторы $ и \ часто применяются для организации запросов, например: write(*, 1) read(*, *) a, b
    1 format( 2x, 'Введите границы отрезка [a, b]: ', \)
    ! или format( 2x, 'Введите границы отрезка [a, b]: ', $)
    После вывода запроса по формату 1 ввод границ отрезка можно будет выполнить на той же строке, где выведен и запрос.
    Прерывание выполнения действия ДП спецификации формата осуществляется дескриптором двоеточие (:). Прерывание происходит в том случае, когда список вывода исчерпан.
    Пример, когда двоеточие прерывает вывод пояснительного текста: real :: a = 0.59, eps = 1e -5 write(*, 1) a, eps
    ! Начало отрезка .59 Точность: .100E-04 write(*, 1) a
    ! Начало отрезка .59 1 format(1x, 'Начало отрезка: ', f4.2, : 2x, 'Точность: ', e9.3)
    Преобразование масштабного коэффициента задается дескриптором
    kP. Дескриптор устанавливает коэффициент масштабирования для всей последовательности ДД F, E, D и G до тех пор, пока не встречен другой дескриптор kP. По умолчанию преобразование масштабного коэффициента не задано. Действие дескриптора kP было описано при рассмотрении ДД F и
    E. Здесь же мы ограничимся примером: real a(4), b(4), c(4), d(4) open(9, file = 'a.txt') read(9, 1) (a(i), b(i), c(i), d(i), i = 1, 4)
    1 format(f10.6, 1p, f10.6, f10.6, -2p, f10.6) write(*, 2) (a(i), b(i), c(i), d(i), i = 1, 4)
    2 format (4f11.3)
    Состав файла a.txt:
    12340000 12340000 12340000 12340000 12.34 12.34 12.34 12.34 12.34e0 12.34e0 12.34e0 12.34e0 12.34e3 12.34e3 12.34e3 12.34e3
    Результат:
    12.340 1.234 1.234 1234.000 12.340 1.234 1.234 1234.000
    317

    О. В. Бартеньев. Современный ФОРТРАН
    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

    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 0 3 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),
    LOGICAL(2),
    LOGICAL(4)
    L2 выводится:
    T для .TRUE.,
    F для .FALSE.
    L1 выводится: T для .TRUE.,
    F для .FALSE.
    BYTE,
    INTEGER(1)
    I5 I11
    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'.
    1   ...   31   32   33   34   35   36   37   38   ...   49


    написать администратору сайта