Файловый ввод/вывод#

В языке Fortran работа с файлами осуществляется с помощью идентификационных номеров. Взаимодействие с файловой системой в основном происходит с помощью встроенных процедур open и inquire. Как правило, рабочий процесс заключается в открытии файла с идентификационным номером, чтении и/или записи в него и последующем закрытии.

integer :: io
open(newunit=io, file="log.txt")
! ...
close(io)

По умолчанию файл будет создан, если он ещё не существует, и открыт как для чтения, так и для записи. Запись в существующий файл начнётся с первой записи (строки) и, следовательно, по умолчанию перезапишет файл.

Чтобы открыть доступ к файлу только для чтения, аргументы status (статус) и action (действие) должны быть указаны в качестве параметров

integer :: io
open(newunit=io, file="log.txt", status="old", action="read")
read(io, *) a, b
close(io)

В случае если файл не существует, произойдёт ошибка времени выполнения. Для проверки существования файла перед его открытием можно использовать функцию inquire

logical :: exists
inquire(file="log.txt", exist=exists)
if (exists) then
  ! ...
end if

С другой стороны, процедура open может возвращать необязательные аргументы iostat и iomsg:

integer :: io, stat
character(len=512) :: msg
open(newunit=io, file="log.txt", status="old", action="read", &
  iostat=stat, iomsg=msg)
if (stat /= 0) then
  print *, trim(msg)
end if

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

Аналогично, запись в файл происходит с использованием ключевых слов status и action. Для создания нового файла используйте следующий синтаксис

integer :: io
open(newunit=io, file="log.txt", status="new", action="write")
write(io, *) a, b
close(io)

В качестве альтернативы можно использовать status=\"replace\" для перезаписи существующего файла. Настоятельно рекомендуется сначала проверить существование файла, прежде чем принимать решение об использовании параметра status. Для добавления данных в выходной файл можно явно указать ключевое слово position

integer :: io
open(newunit=io, file="log.txt", position="append", &
  & status="old", action="write")
write(io, *) size(v)
write(io, *) v(:)
close(io)

Для сброса позиции в файле можно использовать встроенные процедуры rewind и backspace. Процедура rewind возвращает позицию к первой записи (строке), а backspace – к предыдущей записи (строке).

Наконец, для удаления файла файл должен быть открыт и может быть удалён после закрытия следующим образом

logical :: exists
integer :: io, stat
inquire(file="log.txt", exist=exists)
if (exists) then
  open(file="log.txt", newunit=io, iostat=stat)
  if (stat == 0) close(io, status="delete", iostat=stat)
end if

Полезной функцией ввода/вывода являются временные (scratch) файлы, которые можно открыть, указав параметр status=\"scratch\". Такие файлы автоматически удаляются после закрытия файла с соответствующим идентификационным номером.