读取直接访问文件时 GFortran I/O 错误 5002

GFortran I/O error 5002 while reading a direct access file

我在用 Fortran 读取文件时遇到一点问题。如您所见,我正在遍历一个文件,读取特定长度的某些记录。

发生的事情是,当涉及到某个记录时,我收到了 IOSTAT 错误 5002。现在我的问题是这个错误是什么意思:它是文件结尾还是没有留下记录或其他什么?我可以忽略它吗?

我正在使用 MinGW GFortran 4.8.0。

代码如下:

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

iostat= 说明符返回的非零值不可跨编译器移植。如果您想确定特定代码的含义,那么您有两个选择:

  • 阅读编译器的文档(如果存在)
  • 使用带有字符变量的 iomsg= 说明符

在这种情况下,当您尝试 iomsg= 时,您会收到消息 "Non-existing record number"。所以,问题解决了。

嗯,差不多。还有很多话要说。

您可能会惊讶地发现,您在直接访问中依次遍历记录,但没有先达到 "end of file" 状态就达到了 "no record" 状态。您正在测试 (IOS .LT. 0),评论为“!已到达文件末尾”。

读取直接访问连接的文件时,不会出现文件结束条件。

您可以做什么来检测记录不是有效数字,超出文件末尾?便携性不高,但是 iostat= 中的任何正数都表示错误情况。不过,你现在知道这个特殊的 5002 是什么意思了。


我可能还应该补充一点,只有在没有成功的情况下,iomsg= 的字符变量才由传输语句定义。只有当你知道传输失败时才考虑它。