2011-06-24 19 views
6

Soy un principiante de Fortran. Me gustaría poder leer un archivo de texto y guardar su contenido en variables individuales. Encontré un tutorial de Fortran muy útil (http://www.math.hawaii.edu/~hile/fortran/fort7.htm#read), y estoy tratando de seguir uno de los ejemplos allí enumerados. En concreto, hice un archivo de texto llamado datos.txt con el siguiente texto:Lectura de un archivo de texto delimitado por comas línea por línea en Fortran

1.23, 4.56, 7.89 
11, 13, "Sally" 

he guardado este archivo de texto en mi directorio actual. A continuación, he creado un archivo test.f90 (también guardarlo en mi directorio actual) que contiene el siguiente código:

PROGRAM test 
    IMPLICIT NONE 

    REAL :: x, y, z 
    INTEGER :: m, n 
    CHARACTER first*20 

    OPEN(UNIT = 7, FILE = "data.txt") 
    READ(7,*) x, y, z 
    READ(7,*) m, n, first 

    PRINT *, x 
    PRINT *, y 
    PRINT *, z 
    PRINT *, m 
    PRINT *, n 
    PRINT *, first 
END PROGRAM test 

estoy usando el compilador GNU Fortran, que creo que incluye las características por lo menos hasta e incluyendo Fortran95. El código anterior parece compilarse correctamente, al menos con la configuración predeterminada). Pero cuando corro el ejecutable resultante, me sale este mensaje de error:

At line 10 of file test.f90 (unit = 7, file = 'data.txt') 
Fortran runtime error: End of file 

La línea 10 es la línea LEER (7, *) m, n, primero. ¿Puedes ayudarme a ver lo que estoy haciendo mal en el código anterior?

+0

Inténtalo con otro número de unidad (> 10). Tal vez su compilador usa la unidad 7 para un dispositivo preconectado. – eriktous

+0

@eriktous: Muchas gracias por su tiempo, pero desafortunadamente esto no soluciona el problema (al menos cuando uso una unidad de 15). Gracias por el consejo, sin embargo; es realmente bueno saber que el compilador puede usar unidades de 10 o menos para dispositivos preconectados. Voy a tener esto en cuenta. ¡Gracias! – Andrew

Respuesta

2

Puedo reproducir su mensaje de error exacto y el resultado correcto. Estoy usando gfortran en Windows y el Bloc de notas para crear el archivo de datos.
Si finaliza la segunda línea de datos con un carácter de final de línea (pulsando la tecla Intro), el programa mostrará la salida correcta; si no lo finaliza, mostrará el error durante la ejecución.

Básicamente, el tiempo de ejecución intenta leer una línea, pero encuentra un carácter de fin de archivo antes de llegar al final de la línea.

3

Cuando su programa de ejemplo, con sus datos de muestra, ¡funcionó! ¡Felicitaciones! La producción fue de:

1.2300000  
    4.5599999  
    7.8899999  
      11 
      13 
Sally 

de adivinar una posible razón de que no está trabajando para usted, a veces ejecutables Fortran pueden ser sensibles a los finales de línea, exigiendo la correcta alineación de terminación para el sistema operativo, incluyendo en la última línea de un archivo de datos. Por el contrario, muchos editores convertirán en silencio las terminaciones de línea. Comúnmente encuentro este problema con archivos escritos por programas de Microsoft.

+0

De hecho, originalmente hice mi archivo de texto con un editor de Microsoft: Bloc de notas en Windows XP. Justo ahora hice un nuevo archivo de texto que contiene el mismo texto, pero esta vez escrito usando XEmacs y usando un valor unitario de 16 en lugar de 7 o 15. Desafortunadamente, todavía no se ejecuta. Solo por curiosidad, ¿qué editor de texto recomiendas? Además, ¿podría ser que tal vez algunos dialectos Fortran tengan un "carácter terminador"? Por ejemplo, sé que en C, cada archivo de texto debe terminar con un "\ 0" o un puntero nulo, creo. – Andrew

+0

Hay algo peculiar acerca de XEmacs, también. Cuando creo el archivo de texto usando vi, funciona, y obtengo exactamente el mismo resultado que tú.Estoy usando el compilador Fortran de GNU (gfortran); ¿Lo estás usando también? – Andrew

+1

Estoy usando gfortran con Mac OS X. Independientemente del editor, el ejecutable espera el terminador de línea del sistema operativo al final de la línea, incluida la última línea. Como @eriktous escribió, asegúrese de usar Enter para obtener un terminador de línea. Los programas de Microsoft utilizan con frecuencia el terminador incorrecto, lo que también causa problemas no obvios. –

2

Para algunos compiladores, es importante agregar una nueva línea después de la última línea con los datos. Por ejemplo, gfortran es un compilador que necesita eso y es bastante lógico. El compilador de Sun (Oracle) no necesita eso.

+0

¿No es básicamente lo mismo que dije? – eriktous

+0

Sí, lo es. No me di cuenta después de una lectura rápida. Principalmente leí la discusión un poco errónea sobre diferentes editores. –

Cuestiones relacionadas