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!

Anúncios

Escrito por zrhans

Professor at UFSM

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s