FONTE: http://craftmind.wordpress.com/2011/12/16/ler-uma-lista-de-arquivos-em-uma-rotina-fortran/ 16/12/2011 · por cfbastarz ·
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 ou gfortran):
$ ifort -traceback -o le_lista.x le_lista.f90
$ gfortran -o le_lista.x le_lista.f90
E para executar, basta fazer:
$ ./le_lista.x filelst
A opção “-traceback” quando usamos o compilador ifort é 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!
Deixe um comentário