2.15. Внешние файлы

Для обработки внешних файлов в языке FORTRAN существуют операторы: OPEN - открытие файла;

CLOSE - закрытие файла;

READ - чтение из файла;

WRITE - запись в файл;

INQUIRE - опрос файла;

BACKSPACE      - переход к предыдущей записи; REWIND - переход в начало файла;

ENDFILE - запись признака конца файла

и встроенная функция EOF.

Синтаксис оператора OPEN таков: OPEN([UNIT=]усmpойсmво [^'ПЖ=имя файла] [,MODE=pежuм] [,ACCESS=сnособ доступа] [,STATUS=сmamус файла] [,FORM=mun      записей] [,RECL=длuнa записи] [,BLANK=uнmеpnpеmaцuя пробелов] [,BLOCKSIZE=paзмеp буфеpa][,ERR=меmкa] [,IOSTAT=код ошибки]) устройство- целая константа от -32767 до 32767, или целое выражение, или * . Задает номер устройства, к которому присоединяется файл. Устройство * все­гда связано с клавиатурой и экраном, его переопределить нельзя. Устройство O по умолчанию связано с клавиатурой и экраном, 5 - с клавиатурой, 6 - с экраном, но эти устройства можно использовать и для других целей;

имя файла - символьное выражение, можно задать '', тогда программа во время выполнения самостоятельно попросит ввести имя файла;

режим - 'READ', 'WRITE' или 'READWRITE' (по умолчанию); способ доступа - 'DIRECT' или 'SEQUENTIAL' (по умолчанию); статус файла -  'OLD',  'NEW',  'UNKNOWN'  (по умолчанию) или 'SCRATCH'. 'SCRATH' определяет временный файл, который будет уничтожен перед окончанием программы, такой файл не должен иметь имени;

тип записей - 'FORMATTED' (по умолчанию для 'SEQUENTIAL'),

'UNFORMATTED' (по умолчанию для 'DIRECT') или 'BINARY';

длина записи - целое выражение, игнорируется для 'SEQUENTIAL'; интерпретация пробелов - 'ZERO' или 'NULL' (по умолчанию); размер буфера - целое выражение, автоматически округляется до числа, кратного 5І2;

метка - метка оператора, которому передается управление при возникнове­нии ошибки. Если этот параметр не задан, то ошибка открытия файла приводит к аварийному завершению программы;

код ошибки - целая переменная, которая возвращает O, если операция завер­шилась успешно.

Оператор CLOSE записывается так:

CLOSE([UNIT=]усmpойсmво[,STATUS=сmamус файла]

[,ERR=меmкa] [,IOSTAT=код ошибки])

статус файла - 'DELETE' (по умолчанию для временных файлов) или 'KEEP'^o умолчанию для всех остальных);

метка - метка оператора, которому передается управление при возникнове­нии ошибки;

код ошибки - целая переменная, которая возвращает O, если операция завер­шилась успешно.

Оператор READ для ввода из внешнего файла:

READ([UNIT=]усmpойсmво[,[FMT=]фоpмam][,REC=номеp записи] [,END=меmкa-7][,ERR=меmкa-2][,IOSTAT=код ошибки])

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

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

WRITE([UNIT=]усmpойсmво [,[FMT=]фоpмam] [,REC=номеp записи] [,ERR=меmкa] [,IOSTAT=код ошибки]) В файл прямого доступа можно записывать в любое место, даже если это вновь созданный файл; таким образом, некоторые записи в файле могут физически су­ществовать, но быть неопределенными. Переменная код ошибки возвращает ну­левое значение при успешном завершении операции.

Оператор INQUIRE позволяет получить все характеристики файла или уст­ройства. Он записывается в форме запроса об устройстве: INQUIRE([UNIT=]усmpойсmво [,NAME=name] [,NUMBER=number]

[,EXIST=exist] [,NAMED=named] [,OPENED=opened] [,MODE=mode]

[,ACCESS=access] [,DIRECT=direct] [,SEQUENTIAL=seguentia/]

[,FORM=/orm] [,FORMATTED=/ormatted]

[,UNFORMATTED=un/ormatted] [,BINARY=binary] [,RECL=rec/] [,BLANK=b/an£] [,BLOCKSIZE=b/oc£size] [,ERR=меmкa] [,IOSTAT=код ошибки]) или в форме запроса о файле:

INQUIRE(FILE=uмя файла... ) Здесь параметры устройство, имя файла, метка и код ошибки имеют тот же смысл, что и раньше. Все остальные параметры - это переменные целого, логи­ческого и символьного типа, которые возвращают характеристики устройства или файла. Они возвращают следующие значения: name - имя файла,

number - номер устройства,

exist - .TRUE. , если файл существует,

named - .TRUE. , если файл имеет имя,

opened - .TRUE. , если файл присоединен к устройству,

mode - 'READ', 'WRITE', 'READWRITE' или 'UNKNOWN'

access - 'SEQUENTIAL', 'DIRECT' или 'UNKNOWN' ,

direct - 'YES', 'NO' или 'UNKNOWN' ,

sequential - 'YES', 'NO' или 'UNKNOWN' ,

form - 'FORMATTED', 'UNFORMATTED' или

'UNKNOWN' ,

formatted - 'YES', 'NO' или 'UNKNOWN' ,

unformatted - 'YES', 'NO' или 'UNKNOWN' ,

binary - 'YES', 'NO' или 'UNKNOWN' ,

recl - длина записи в байтах,

blank - 'NULL', 'ZERO' или 'UNKNOWN' ,

b/ocksize - размер буфера в байтах.

Оператор BACKSPACE устанавливает файловый указатель на начало пре­дыдущей записи и может использоваться в двух формах : BACKSPACE устройство

или

BACKSPACE([UNIT=]усmpойсmво[,ERR=меmкa]

[,IOSTAT=код ошибки]) Оператор REWIND устанавливает файловый указатель на начало файла: REWIND устройство

или

REWIND([UNIT=]усmpойсmво[,ERR=меmкa][,IOSTAT=код ошибки]) Оператор ENDFILE записывает в файл признак конца файла, усекая таким образом файл:

ENDFILE устройство

или

ENDFILE([UNIT=]усmpойсmво[,ERR=меmкa][,IOSTAT=код ошибки]) Эти три оператора работают и для текстовых файлов.

В языке FORTRAN есть всего одна встроенная функция для обработки фай­лов

EOF(integer)

Функция возвращает истинное значение, если при вводе достигнут конец файла.

Из текстового файла можно читать числа в свободном формате, т.е. READ(номеp устройства,*,... ) ... Но если числа записаны в файле совершенно произвольным образом, то прочесть их не так просто, как в языках PASCAL и С, потому что каждое выполнение оператора READ - это чтение новой строки.

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

READ/WRITE(UNIT=uмя,FMT=фоpмam)сnuсок ввода/вывода Внутренние устройства используются для преобразования числа в строку и наоборот. Если в качестве устройства используется символьный массив, то каж­дый элемент массива считается записью. Можно использовать подстроку в каче­стве внутреннего устройства.