2012-04-21 9 views
5

Entiendo que Fortran, al leer datos del archivo, salteará líneas que comiencen con asterisco y (asterisco) (*) suponiendo que son un comentario. Bueno, parece que tengo un problema para lograr este comportamiento con un programa muy simple que creé. Este es mi sencillo programa de Fortran:Leyendo líneas de comentarios correctamente en un archivo de entrada utilizando Fortran 90

1  program test 
    2 
    3  integer dat1 
    4 
    5  open(unit=1,file="file.inp") 
    6 
    7  read(1,*) dat1 
    8 
    9 
10  end program test 

esto es "file.inp":

1 *Hello 
    2 1 

he construido mi programa sencillo con

gfortran -g -o test test.f90 

Cuando corro, me sale el error :

At line 7 of file test.f90 (unit = 1, file = 'file.inp') 
Fortran runtime error: Bad integer for item 1 in list input 

Cuando ejecuto el archivo de entrada wi la línea de comentario eliminada, es decir .:

1 1 

El código funciona bien. Entonces, parece ser un problema con Fortran al interpretar correctamente esa línea de comentarios. Debe ser algo extremadamente simple Me falta aquí, pero no puedo encontrar nada en Google.

Respuesta

7

Fortran no omite automáticamente las líneas de comentarios en los archivos de entrada. Puede hacerlo con la suficiente facilidad leyendo primero la línea en una cadena, revisando el primer carácter para su símbolo de comentario o buscando la cadena para ese símbolo, luego, si la línea no es un comentario, haciendo una "lectura interna" de la cadena para obtener el valor numérico

Algo así como:

use, intrinsic :: iso_fortran_env 

character (len=200) :: line 
integer :: dat1, RetCode 

read_loop: do 
    read (1, '(A)', isostat=RetCode) line 
    if (RetCode == iostat_end) exit ReadLoop 
    if (RetCode /= 0) then 
     ... read error 
     exit ReadLoop 
    end if 
    if (index (line, "*") /= 0) cycle read_loop 
    read (line, *) dat1 
end do read_loop 
+0

Sí, me di cuenta de eso, en realidad, y volvía a publicar mi solución. Sin embargo, su código es un poco más inteligente que la solución que se me ocurrió (estaba usando la opción "end =" para mi declaración de lectura). Una cosa que no entiendo, sin embargo, es ¿cuál es la necesidad del uso de "iso_fortran_env"? Lo siento, he escrito algunos grandes programas de Fortran y los pongo a trabajar, pero soy un poco novato en lo que respecta a los módulos intrínsecos y lo que aportan a la mesa. – rks171

+2

Entre otras cosas, iso_fortran_env proporciona el valor "isostat_end" para probar si un código de retorno distinto de cero es de fin de archivo. Esto permite el uso del constructo "exit" en lugar de las etiquetas de declaración, como con "end = LineNumber". –

0

Fortran no ignora nada por defecto, a menos que esté utilizando listas de nombres y en ese caso los comentarios comienzan con un signo de exclamación.

Cuestiones relacionadas