Neste código
read(unit,'I0',err=100) my_integer
100 error_stop "Something went wrong."
o especificador err informa ao programa para ir para a instrução rotulada 100
se algo deu errado na leitura de um inteiro do arquivo com identificador de unidade unit
.
Existe alguma alternativa para esse tipo de tratamento de erros? Conheço algumas soluções alternativas, como usar inquire
para descobrir se um arquivo existe ou outras maneiras de detectar o fim de um arquivo. Mas, para um caso como este, em que tento ler um inteiro e, por algum motivo, não consigo, existe outra maneira de detectar esse erro?
Pergunto isso porque parece um tanto obsoleto usar rótulos de instruções. Talvez eu esteja apenas presumindo isso porque goto
instruções são consideradas obsoletas. Por favor, corrija-me se eu estiver errado.
(Quase) todas as instruções de entrada/saída do Fortran usam os especificadores
iostat=
e . 1iomsg=
Se não houver condição de erro, condição de fim de arquivo ou condição de fim de registro em uma instrução de entrada/saída, qualquer
iostat=
especificador desse tipo significa que a variável de status está definida como0
. Da mesma forma, qualqueriomsg=
especificador desse tipo deixa a variável correspondente inalterada. 2A declaração READ da questão poderia, em sua forma mais básica, parecer-se com (observando duas correções no formato):
No entanto,
err=
significa que o fluxo de execução salta em uma condição de erro , enquantostatus
poderia ser diferente de zero e indicar uma condição de fim de arquivo (correspondente aend=
). O módulo intrínseco ISO_FORTRAN_ENV fornece a constante IOSTAT_END, que pode ser usada para testar se houve uma condição de fim de arquivo e nenhuma condição de erro:Lembre-se de que as condições de fim de registro (correspondentes a
EOR=
) ocorrem somente em leituras não avançadas.Os números de status de entrada/saída são essencialmente insignificantes.
iomsg=
São mais úteis para humanos, mas ainda não são confiáveis.1 A instrução PRINT, diferentemente da instrução WRITE, não aceita nenhuma lista de informações de controle; uma forma da instrução READ também não aceita nenhuma lista de informações de controle. As outras formas da instrução READ, BACKSPACE, CLOSE, ENDFILE, FLUSH, INQUIRE, OPEN, REWIND, WAIT e WRITE, aceitam os especificadores.
2 Para ser mais preciso, isso significa que tanto o status da definição quanto o valor, se houver, permanecem inalterados. Se você for testar o valor da mensagem de E/S, certifique-se de defini-lo antes da instrução de entrada/saída.