21 set 2017

CRIAR E LER UMA LISTA DE ARQUIVOS EM UMA ROTINA FORTRAN

LER UMA LISTA DE ARQUIVOS EM UMA ROTINA FORTRAN

Esses dias estava tentanto executar uma rotina em fortran que lia um arquivo texto e convertia em binário. Como eram vários arquivos a serem lidos, eu tinha duas opções: primeira, que seria fazer um script em shell com um loop para ler os arquivos, gerar a rotina para ler cada arquivo e executar; segunda, melhorar a rotina para que ela pudesse ler uma lista com arquivos e executar a conversão para cada arquivo lido da lista. É claro que a segunda opção é mais eficiente e elegante, e também a que dá mais preguiça de pensar. Eis a solução (não sei se é a melhor, mas funciona):

program le_lista

implicit none

! Variaveis:
! file: e o nome do arquivo a ser lido
! filelst: e o nome da lista com os arquivos a serem lidos
! m: e um contador
! ierro: e uma variavel de status (se ierro=1, entao ocorreu erro de I/O)
! fileprc: vai receber a quantidade total de arquivos lidos

character(len=200)                 :: file, filelst, fileinp
integer                            :: m, nfprec, ierro
character(len=200), dimension(500) :: fileprc

call getarg(1,filelst)

open(unit=100, file=trim(filelst), status='old', form='formatted')

m=0

do

  read(100, '(A)', iostat=ierro) file
  if(ierro.ne.0) exit
  m=m+1
  fileprc(m)=trim(file)
  write(*,*)'arquivo: ',file

enddo

nfprec=m

close(100)

  write(*,*)'numero de arquivos lidos: ',nfprec

end program le_lista

No programa acima, há um loop que se encarrega de ler um arquivo (filelst) cujo conteúdo é o nome de cada arquivo texto, da seguinte forma:

$ more filelst
 arquivo1.txt
 arquivo2.txt
 arquivo3.txt
 ...

O pulo do gato nesse programa, é o comando “call getarg” que vai permitir que a rotina tome o arquivo “filelst” como se fosse um argumento.

Dentro desse loop em que os nomes dos arquivos são lidos, pode-se realizar as operações que se desejar com o conteúdo deles.

Para compilar, pode-se fazer assim (usando o ifort):

$ ifort -traceback -o le_lista.x le_lista.f90

E para executar, basta fazer:

$ ./le_lista.x filelst

A opção “-traceback” é interessante porque, mesmo quando a compilação é bem sucedida, pode ser que na execução exista algum erro, como a falta de um argumento. Assim, se você tentar executar o programa “le_lista.x” sem o argumento “filelst”, você vai receber a seguinte mensagem de erro:

$ ./le_lista.x
forrtl: severe (43): file name specification error, unit 100, file "Unknown"
Image              PC                Routine            Line        Source
le_lista.x         000000000046FAFA  Unknown               Unknown  Unknown
le_lista.x         000000000046E5F6  Unknown               Unknown  Unknown
le_lista.x         000000000042FC60  Unknown               Unknown  Unknown
le_lista.x         0000000000405E6E  Unknown               Unknown  Unknown
le_lista.x         00000000004053AF  Unknown               Unknown  Unknown
le_lista.x         00000000004104ED  Unknown               Unknown  Unknown
le_lista.x         0000000000402BA9  MAIN__                     13  le_lista.f90
le_lista.x         0000000000402A9C  Unknown               Unknown  Unknown
libc.so.6          00007F03CA7A1EFF  Unknown               Unknown  Unknown
le_lista.x         0000000000402999  Unknown               Unknown  Unknown

Na lista de erros de execução do ifort, há a seguinte descrição da mensagem “severe (43)”:

severe (43): File name specification error
FOR$IOS_FILNAMSPE. A pathname or file name given to an OPEN or INQUIRE statement was not acceptable to the Intel Fortran RTL I/O system.

Repare que na mensagem de erro, há a indicação de que na linha 13 há uma problema. Na verdade, a mensagem se refere ao arquivo “filelst” que está declarado na linha 13 do programa, que está sendo indicado pela mensagem “severe (43)”.

É isso!

Leave a Reply