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.