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

11. Операции над внешними файлами

11.8. Оператор FIND

Оператор устанавливает прямой файл на запись rec и заносит в ассоциируемую переменную файла номер rec. Имеет две формы:

FIND([UNIT =] u, REC = rec [, ERR = err] [, IOSTAT = iostat])

и

FIND(u'rec [, ERR = err] [, IOSTAT = ios])

Описание спецификаторов см. в разд. 11.6.

11.9. Оператор DELETE

Удаляет запись rec в связанном файле.

DELETE([UNIT =] u [, REC = rec] [, ERR = err] [, IOSTAT = iostat])

Описание спецификаторов см. в разд. 11.6.

Оператор логически удаляет заданную запись из файла, помечая ее как удаленную, и освобождает эту запись для занесения новых данных. При удалении записи, если не возникло ситуации ошибки, ассоциируемая переменная файла получает значение rec + 1. Если спецификатор REC не задан, то удаляется текущая запись.

Пример для FIND и DELETE:

integer(4) ios, asv character(8) :: st = 'A record'

! Создадим прямой файл с тремя записями

open(1, file = 'c.dat', access = 'direct', form = 'formatted', recl = 9,& status = 'new', associatevariable = asv, organization = 'relative')

write(1, '(a8)', rec = 1) st; write(1, '(a8)', rec = 2) st; write(1, '(a8)', rec = 3) st

find(1, rec = 2)

! или: find(1'2)

print *, asv

!

2

delete(1, rec = 2)

 

 

print *, asv

!

3

read(1, rec = 2, iostat = ios) st

 

 

if(ios /= 0) then

 

 

print *, 'Error'

 

 

else

 

 

print *, st

! Напечатает пустую строку

end if

 

 

end

 

 

11.10. Оператор UNLOCK

Освобождает запись в связанном файле или в файле с последовательной организацией, заблокированную предшествующим оператором READ. Имеет две формы:

UNLOCK u

365

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

и

UNLOCK([UNIT =] u [, ERR = label] [, IOSTAT = iostat])

Описание спецификаторов см. в разд. 11.6.

Если нет заблокированной записи, оператор игнорируется.

11.11. Оператор WRITE

Оператор передает данные из списка вывода в файл, подсоединенный к устройству u. В CVF в случае прямого файла изменяет ассоциируемую переменную файла, указанную в соответствующем операторе OPEN.

WRITE([UNIT =] u [, [[FMT =] fmt] | [[NML =] nml]

&

[, ADVANCE = advance] [, ERR = err]

&

[, IOSTAT = iostat] [, REC = rec]) [iolist]

 

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

будет выполняться

на экран, если в качестве устройства использована звездочка (*).

Если устройство не было подсоединено к файлу, то при выводе будут

выполнены действия, задаваемые оператором:

 

OPEN(u, FILE = ' ', STATUS = 'UNKNOWN',

&

ACCESS = 'SEQUENTIAL', FORM = form)

 

где form вычисляется со значениями 'FORMATTED' (при форматном вводе) и 'UNFORMATTED' (при неформатном). Если имя файла включено в запускающую программу командную строку, то это имя будет использовано для имени файла. В противном случае программа попросит ввести имя файла с клавиатуры.

fmt - спецификатор формата. При неформатном или двоичном вводе параметр fmt должен быть опущен. Вывод будет управляться списком, если в качестве fmt использована звездочка. Управляемый списком вывод возможен только в последовательные текстовые файлы.

nml - спецификатор именованного списка. При выводе именованного списка iolist должен быть опущен. Управляемый именованным списком вывод может быть выполнен только в файлы, открытые для последовательного доступа.

advance - символьное выражение, позволяющее задать продвигающийся или непродвигающийся последовательный форматный вывод и вычисляемое со значениями 'YES' или 'NO'. Значение 'YES' задается по умолчанию и означает, что задан продвигающийся вывод, т. е. после выполнения каждого оператора вывода проставляются символы конца записи и файл позиционируется вслед за проставленными символами. При непродвигающемся В/В (ADVANCE='NO') символы конца записи не проставляются и файл оставляется вслед за последним выведенным символом.

366

11. Операции над внешними файлами

err - метка исполняемого оператора. При возникновении ошибки В/В управление передается на оператор, имеющий метку err.

iostat - целочисленная переменная, возвращающая 0 при отсутствии ошибок или номер возникшей ошибки.

rec - целочисленное выражение, возвращающее положительное число, называемое номером записи. Параметр rec может быть задан только при работе с файлами прямого доступа (иначе возникнет ошибка В/В). Параметр rec указывает на запись, в которую будут переданы данные при выполнении оператора WRITE. В FPS по умолчанию значение rec равно номеру текущей записи файла. И если при вводе из прямого файла параметр отсутствует, то будет изменена текущая запись файла. В CVF при работе с прямыми файлами наличие спецификатора REC обязательно.

iolist - список вывода, содержащий выражения, результаты которых должны быть переданы в файл.

При записи в последовательный файл все записи, расположенные после введенной, удаляются (при наличии таковых) и файл позиционируется перед записью "конец файла". Таким образом, после вывода в последовательный файл необходимо применить BACKSPACE или REWIND для выполнения оператора READ. Препятствий для применения оператора WRITE, однако, нет.

11.12. Оператор PRINT

Выводит данные на экран (устройство *). PRINT * | fmt [, iolist]

где fmt - спецификатор формата; iolist - список вывода. Если звездочка замещает fmt, то вывод управляется списком iolist.

11.13. Оператор REWRITE

Замещает в файле прямого доступа текущую запись на новую. В случае прямого файла изменяет ассоциируемую переменную файла, указанную в соответствующем операторе OPEN. При выводе в форматный файл имеет вид:

REWRITE([UNIT =] u, [FMT =] fmt [, IOSTAT = iostat]

&

[, ERR = err]) [iolist]

 

С неформатными файлами употребляется так:

 

REWRITE([UNIT =] u [, IOSTAT = iostat] [, ERR = err]) [iolist]

Спецификаторы имеют тот же смысл, что и в операторе WRITE. Текущей является запись, на которую установился файл в результате

выполнения предшествующего оператора READ. Причем с устройством u между READ и REWRITE не должны выполняться другие операторы В/В,

367

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

кроме INQUIRE. В противном случае текущая запись окажется неопределенной.

Число символов в списке вывода и задаваемых спецификатором формата не должно превышать длины записи, определяемой спецификатором RECL оператора OPEN. Если же число передаваемых символов меньше длины записи, то недостающие символы восполняются пробелами.

Пример:

type person

 

character(len = 15) lastn, firstn

 

end type person

 

integer ios

 

100 format(2a15)

 

open(3, file = 'a.txt', form = 'formatted', access = 'direct', recl = 30)

! Создадим две записи

 

write(3, fmt = 100, rec = 1) person('Blake', 'William')

write(3, fmt = 100, rec = 2) person('Maugham', 'W. Somerset')

read(3, fmt = 100, rec = 1)

! Текущей является запись 1

rewrite(3, 100, iostat = ios) person('Byron', 'G. Gordon')

if(ios /= 0) print *, ' Rewriting error'

end

 

11.14. Оператор INQUIRE

Возвращает свойства устройства или внешнего файла. Форма оператора опроса файла:

INQUIRE(FILE = file [, ERR = err] [, IOSTAT = iostat]

&

[, DEFAULTFILE = def], slist)

 

Форма оператора опроса устройства:

 

INQUIRE([UNIT =] u [, ERR = err] [, IOSTAT = iostat], slist)

 

Форма оператора опроса списка вывода:

 

INQUIRE(IOLENGTH = iolength) [iolist]

 

file - символьное выражение, задающее имя файла, информацию о котором возвращает оператор INQUIRE.

u - устройство внешнего файла (разд. 10.2), о котором необходимо получить информацию. Если задано UNIT = *, то нельзя включать спецификатор NUMBER.

В операторе INQUIRE можно задать либо параметр u, либо file, но не одновременно и то и другое. Если задан параметр u, то выполняется опрос устройства. Если задан file, то выполняется опрос файла.

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

368

11. Операции над внешними файлами

Если в INQUIRE присутствует спецификатор DEFAULTFILE, то он должен быть и в соответствующем операторе OPEN. Спецификатор DEFAULTFILE = def может быть задан в дополнение или вместо спецификатора FILE = file. И file и def могут начинаться с тильды (~).

iolength - переменная стандартного целого типа, возвращающая размер списка вывода. Эта форма оператора INQUIRE включает только спецификатор IOLENGTH= и список вывода iolist. Все другие спецификаторы должны отсутствовать. Список iolist во всех других случаях отсутствует. Например:

real :: r = 1.1, a(100) = 2.2

 

 

integer :: iol, kar(50) = 5

 

 

character(25) :: st(25) = 'abcd'

! iol - размер списка вывода

inquire(iolength = iol) r, a, kar, st

print *, iol

!

1229

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

slist - один или более спецификаторов из следующего списка:

[, ACCESS = access] [, ACTION = action] [, BINARY = binary]

&

[, BLANK = blank] [, BLOCKSIZE = blocksize]

&

[, BUFFERD = bf*] [, CARRIAGECONTROL = carriagecontrol]

&

[, CONVERT = fm*] [, DELIM = delim] [, DIRECT = direct]

&

[, ERR = err] [, EXIST = exist] [, FORM = form]

&

[, FORMATTED = formatted] [, IOFOCUS = iofocus]

&

[, IOSTAT = iostat] [, MODE = mode] [, NAME = name]

&

[, NAMED = named] [, NEXTREC = nextrec] [, NUMBER = num]

&

[, OPENED = opened] [, ORGANIZATION = org*] [, PAD = pad]

&

[, POSITION = position] [, READ = read] [, READWRITE = readwrite] & [, RECL = recl] [, RECORDTYPE = rtyp*] [, SEQUENTIAL = seq] & [, SHARE = share] [, UNFORMATTED = unformatted] [, WRITE = write])

Замечание. Отмеченные звездочкой параметры применимы только в CVF.

access - символьная переменная. Возвращает 'APPEND', если заданное устройство или файл открыты для добавления данных. Возвращает 'SEQUENTIAL', если устройство или файл открыты для последовательного доступа, и возвращает 'DIRECT', если устройство или файл открыты для прямого доступа. Возвращает 'UNDEFINED' при отсутствии подсоединения.

action - символьная переменная, возвращающая 'READ', если файл открыт только для чтения, или 'WRITE', если файл открыт только для записи, или 'READWRITE', если файл подсоединен как для чтения, так и для записи. Возвращает 'UNDEFINED' при отсутствии подсоединения.

369

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

binary - символьная переменная. Возвращает 'YES', если файл или устройство опознаны как двоичные, и 'NO' или 'UNKNOWN' - в противном случае.

blank - символьная переменная. Возвращает 'NULL', если действует дескриптор преобразования BN, и возвращает 'ZERO', если действует дескриптор BZ. Возвращает 'UNDEFINED' при отсутствии подсоединения или если файл открыт не для форматного В/В.

blocksize - переменная стандартного целого типа. Возвращает размер буфера В/В в байтах. Возвращает 0 при отсутствии подсоединения.

bf - символьная переменная. Возвращает 'YES' ('NO'), если файл или устройство подсоединены и действует (не действует) буферизация, или 'UNKNOWN', если файл или устройство не подсоединены.

carriagecontrol - символьная переменная, возвращающая 'FORTRAN', если первый символ форматной записи трактуется как символ управления кареткой, или 'LIST', если первый символ форматных файлов ничем не отличается от других символов записи.

delim - символьная переменная, возвращающая 'APOSTROPHE', если для символьных данных при управляемом списком В/В в качестве ограничителя используется апостроф ('). Возвращает 'QUOTE', если ограничителями являются кавычки ("). Возвращает 'NONE', если ограничитель не задан. Возвращает 'UNDEFINED' при отсутствии подсоединения.

direct - символьная переменная. Возвращает 'YES', если опрашиваемое устройство или файл открыты для прямого доступа, и возвращает 'NO' или 'UNKNOWN' в противном случае.

err - метка исполняемого оператора. При возникновении ошибки управление передается на оператор, имеющий метку err.

exist - логическая переменная; возвращает .TRUE., если опрашиваемое устройство или файл существует, или .FALSE. - в противном случае.

fm - символьная переменная. Возвращает одно из перечисленных в разд. 11.4 для спецификатора CONVERT значений, или 'UNKNOWN', если файл или устройство не подсоединены для неформатной передачи данных. form - символьная переменная. Возвращает 'FORMATTED', если устройство или файл подсоединены для форматного В/В; возвращает 'UNFORMATTED' при неформатном В/В и возвращает 'BINARY' при двоичном

В/В. Возвращает 'UNDEFINED' при отсутствии подсоединения.

formatted - символьная переменная. Возвращает 'YES', если устройство или файл открыты для форматного В/В, и 'NO' - в противном случае. Возвращает 'UNKNOWN', если процессор не может определить, какой В/В разрешен.

iofocus - переменная стандартного логического типа. Возвращает

.TRUE., если заданное устройство (окно приложения QuickWin) находится в фокусе, в противном случае возвращает .FALSE.. Параметр может быть использован только с QuickWin-приложениями.

370

11. Операции над внешними файлами

iostat - переменная стандартного целого типа. Возвращает 0 при отсутствии ошибок, отрицательное число, если возникла ситуация "конец файла", или номер возникшей ошибки.

mode - символьная переменная. Возвращает значения mode или action

('READ', 'WRITE' или 'READWRITE'), заданные для устройства (файла)

оператором OPEN. Возвращает 'UNDEFINED' приотсутствии подсоединения. name - символьная переменная. Возвращает при опросе устройства имя подсоединенного к нему файла. Если файл не подсоединен к устройству или если подсоединенный файл не имеет имени, значение переменной name не определено. При опросе файла name возвращает заданное имя файла. named - логическая переменная. Возвращает .TRUE., если файл имеет

имя, и .FALSE. - в противном случае.

nextrec - переменная стандартного целого типа. Возвращает номер следующей записи в файле прямого доступа. Номер первой записи файла равен единице.

num - переменная стандартного целого типа. При опросе файла возвращает номер подсоединенного к файлу устройства. Если к файлу не подсоединено устройство, значение переменной num не определено. При опросе устройства переменная num возвращает номер опрашиваемого устройства. Если задано UNIT = *, то нельзя включать спецификатор NUMBER.

opened - логическая переменная, возвращающая при опросе устройства

.TRUE., если какой-либо файл подсоединен к устройству, и .FALSE. - в противном случае. При опросе файла возвращает .TRUE., если файл подсоединен к какому-либо устройству, и .FALSE. - в противном случае. org - символьная переменная, возвращает значение 'SEQUENTIAL', если файл имеет последовательную организацию, 'RELATIVE', если - связанную, или 'UNKNOWN', если процессор не может определить вид организации

файла.

pad - символьная переменная, возвращающая 'YES', если файл открыт с PAD = 'YES', и 'NO' - в противном случае.

position - символьная переменная, возвращающая 'REWIND', если файл позиционирован в своей начальной точке. Возвращает 'APPEND', если файл расположен в своей конечной точке перед записью "конец файла". Возвращает 'ASIS', если файл подсоединен без изменения позиции. Возвращает 'UNDEFINED' при отсутствии подсоединения или если файл подсоединен для прямого доступа.

read - символьная переменная, возвращающая 'YES', если файл открыт для чтения, и 'NO', если из файла нельзя вводить данные. Возвращает 'UNKNOWN', если процессор не может определить, разрешается ли читать из файла.

readwrite - символьная переменная, возвращающая 'YES', если файл открыт как для чтения, так и для записи, и 'NO', если нельзя выполнять

371

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

чтение или запись. Возвращает 'UNKNOWN', если процессор не может определить, разрешается ли использовать файл и для чтения и для записи.

recl - переменная стандартного целого типа. Возвращает длину записи (в байтах) файла прямого доступа. Если файл подсоединен для неформатной передачи данных, возвращаемое число байт зависит от используемой операционной системы.

rtyp - символьная переменная. Возвращает одно из перечисленных

вразд. 11.4 для спецификатора RECORDTYPE значений, или 'UNKNOWN', если файл или устройство не подсоединены.

seq - символьная переменная. Возвращает 'YES', если файл подсоединен для последовательного доступа, и'NO' или'UNKNOWN' - в противном случае.

share - символьная переменная. Возвращает значение статуса share,

заданного файлу оператором OPEN: 'COMPAT', 'DENYRW', 'DENYWR', 'DENYRD' и 'DENYNONE'. При опросе устройства, если к устройству не подсоединен файл, значение переменной share не определено.

unformatted - символьная переменная. Возвращает 'YES', если файл открыт для неформатной передачи данных, и 'NO' - в противном случае. Возвращает 'UNKNOWN', если процессор не может определить, какой В/В разрешен.

write - символьная переменная, возвращающая 'YES', если файл открыт для записи, и 'NO', если в файл нельзя выводить данные. Возвращает 'UNKNOWN', если процессор не может определить, допустимо ли выводить

вфайл данные.

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

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

Если при опросе устройства ключевое слово UNIT= опущено, то параметр u должен идти первым. Другие параметры могут располагаться в произвольном порядке, но не должны повторяться.

Пример:

character(25) :: st(25) = ' '

open(1, file = 'a.txt', action = 'write', position = 'append') write(1, *) st

rewind 1

inquire(1, name = st(1), action = st(2), blank = st(3), position = st(4)) print *, (trim(st(i)), ' ', i = 1, 4) ! a.txt WRITE NULL REWIND

372