Entrada/Saída em Ficheiros#

Em Fortran, arquivos são gerenciados por identificadores unitários. Interações com o sistema de arquivos acontece principalmente através dos procedimentos integrados open e inquire. Geralmente, o fluxo de trabalho é abrir um arquivo para um identificador unitário, ler e/ou escrever nele e fechá-lo novamente.

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

Por padrão o arquivo será criado se já não existir e aberto tanto para ler quanto escrever. Escrever em um arquivo existente começará no primeiro registro (linha) e portanto sobrescreverá o arquivo por padrão.

Para um acesso de somente leitura em um arquivo o status e a action tem que ser especificados com

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

No caso do arquivo não estar presente um erro em tempo de execução ocorrerá. Para checar se o arquivo existe antes de abri-lo, a função inquire pode ser usada

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

Alternativamente, o procedimento open pode retornar opcionalmente iostat e 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

Note que iomsq requer uma variável de caracteres de tamanho fixado com espaço suficiente para obter a mensagem de erro.

Similarmente, escrever em um arquivo ocorre quando usa as palavras-chave status e action. Para criar um novo arquivo use

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

Alternativamente, status="replace" pode ser usado para sobrescrever um arquivo existente. É altamente recomendado que primeiro cheque a existência do arquivo antes de decidir pelo uso do status. Para anexar em um arquivo de saída a palavra-chave position pode ser especificada explicitamente com

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

Para reiniciar a posição em um arquivo, os procedimentos integrados rewind e backspace podem ser usados. rewind irá reiniciar no primeiro registro (linha), enquanto backspace irá retornar para o registro anterior (linha).

Finalmente, para deletar um arquivo o arquivo deve ser aberto e pode ser deletado após fechar com

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

Uma funcionalidade útil de IO é arquivos de rascunho, que podem ser abertos com status="scratch". Eles serão automaticamente deletados após fechar o identificador unitário.