write una matriz manejo leer escritura escribir datos crear como caracteres avanzado archivos archivo fortran gfortran

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