¿sabe si la siguiente declaración se garantiza que es cierta según uno de los estándares fortran 90/95/2003? "Supongamos que una instrucción de lectura para una variable de caracteres tiene una línea en blanco (es decir, que contiene solo espacios en blanco y nuevos caracteres de línea) .Si el especificador de formato es un asterisco (*), continúa leyendo las líneas siguientes hasta que se encuentra la línea en blanco. Si el especificador de formato es '(A)', se sustituye una cadena en blanco a la variable de caracteres.Lectura de la declaración de lectura de Fortran más allá del final de la línea
Por ejemplo, consulte el siguiente programa mínimo y archivo de entrada.
código de programa: archivo
PROGRAM chk_read
INTEGER, PARAMETER :: MAXLEN=30
CHARACTER(len=MAXLEN) :: str1, str2
str1='minomonta'
read(*,*) str1
write(*,'(3A)') 'str1_start|', str1, '|str1_end'
str2='minomonta'
read(*,'(A)') str2
write(*,'(3A)') 'str2_start|', str2, '|str2_end'
END PROGRAM chk_read
de entrada:
----'input.dat' content is below this line----
yamanakako
kawaguchiko
----'input.dat' content is above this line----
Tenga en cuenta que hay cuatro líneas en 'input.dat' y la primera y tercera líneas están en blanco (solamente contienen espacios en blanco y nuevos personajes de línea). Si funciono el programa como
$ ../chk_read <input.dat> output.dat
Me da la siguiente salida
----'output.dat' content is below this line----
str1_start|yamanakako |str1_end
str2_start| |str2_end
----'output.dat' content is above this line----
La primera instrucción de lectura para la variable 'cadena1' parece mirar a la primera línea de 'input.dat', encuentro una línea en blanco, avance a la segunda línea, encuentre el valor del carácter 'yamanakako' y guárdelo en 'str1'.
En contraste, la segunda instrucción de lectura para la variable 'str2' parece tener la tercera línea, que está en blanco, y almacena la línea en blanco en 'str2', sin moverse a la cuarta línea.
Intenté compilar el programa con Intel Fortran (ifort 12.0.4) y GNU Fortran (gfortran 4.5.0) y obtuve el mismo resultado.
Un poco sobre el trasfondo de hacer esta pregunta: Estoy escribiendo una subrutina para leer un archivo de datos que usa una línea en blanco como separador de bloques de datos. Quiero asegurarme de que la línea en blanco, y solo la línea en blanco, se deseche mientras leo los datos. También necesito que sea compatible y estándar.
Gracias por su ayuda.
Es una información muy útil que nunca se encontró con un caso excepcional sobre el comportamiento "fmt = *". Gracias. Apreciaría mucho, sin embargo, si pudiera confirmar que los comportamientos "fmt = *" y "fmt = '(A)'" que se observan aquí son los comportamientos estándar, por ejemplo, al citar alguna literatura. – norio
@norio Acabo de editar mi respuesta con lo que podría estar buscando.Además, al escribir código portátil, es bueno tener acceso a diferentes plataformas: el estándar no garantiza el comportamiento, simplemente establece qué comportamiento debería ser. – milancurcic
Gracias por la cita del borrador estándar. Eso es muy claro. Sí, estoy de acuerdo con usted acerca de la importancia de realizar pruebas en diferentes plataformas; al final, obtengo el resultado de una máquina real. Además de eso, en la fase inicial de redacción de un programa, quiero vigilar para no confiar en una peculiaridad de un entorno específico sin darme cuenta. – norio