Файловый ввод/вывод#
В языке 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\"
. Такие файлы автоматически удаляются после закрытия файла с соответствующим идентификационным номером.