una - GFortran I/O error 5002 al leer un archivo de acceso directo
manejo de archivos en fortran (1)
Los valores distintos de cero devueltos por un especificador iostat=
no son portátiles entre los compiladores. Si desea determinar qué significa un código en particular, entonces tiene dos opciones:
- lea la documentación del compilador (si existe)
- utilice el
iomsg=
especificador con una variable de caracteres
En este caso, cuando probé iomsg=
recibiste el mensaje "Número de registro iomsg=
". Entonces, problema resuelto.
Bueno, casi. Hay más para decir.
Puede que se sorprenda de que esté revisando los registros, a su vez, en acceso directo, pero que estén llegando al estado "sin registro" sin alcanzar primero el estado "final del archivo". Está probando (IOS .LT. 0)
con un comentario "! Fin del archivo alcanzado".
Al leer un archivo conectado para acceso directo, no se produce el final de la condición de archivo.
¿Qué puede hacer para detectar que el registro no es un número válido, más allá del final del archivo? No mucho, de forma portátil, pero cualquier número positivo de iostat=
indica una condición de error. Ahora sabes, sin embargo, lo que significa este particular 5002
.
Probablemente también debería agregar que la variable de caracteres para iomsg=
está definida por la declaración de transferencia solo si no hay éxito. Considérelo solo si sabe que la transferencia falló.
Tengo un pequeño problema al leer un archivo en Fortran. Como pueden ver, estoy sobre un archivo que lee ciertos registros con una longitud específica.
Lo que sucede es que, cuando se trata de un cierto registro, recibo un error IOSTAT 5002. Ahora mi pregunta es qué significa este error: ¿está al final del archivo o no queda registro o algo más? ¿Puedo ignorarlo?
Estoy usando MinGW GFortran 4.8.0.
Aquí está el código:
PROGRAM test_read
INTEGER*4 HCM_error
DOUBLE PRECISION N_Record(22)
CHARACTER*8 C_Record(22)
EQUIVALENCE (N_Record,C_Record)
OPEN (UNIT=11, FILE=''C:/BORDER/D__HOL.000'',STATUS=''OLD'', ACCESS=''DIRECT'',RECL=176, ACTION=''READ'', IOSTAT=IOS)
HCM_error=0
DO N_rec = 1, 2000
READ (11, REC=N_rec, IOSTAT=IOS) C_Record
WRITE(*,*) "|",IOS,'' '',N_rec,'' '',N_record(21),'' '',N_record(22),"|"
!End of file reached (or non existing record) ?
IF ((IOS .LT. 0) .OR. (IOS .EQ. 36)) EXIT
IF (IOS .NE. 0) THEN
!Error in (border-) line data
HCM_Error = 1049
EXIT
END IF
END DO
CLOSE(UNIT=11)
WRITE (*,*) HCM_error
END PROGRAM