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

时间:2016-07-27 12:53:50

标签: fortran gfortran

我在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

1 个答案:

答案 0 :(得分:3)

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

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

在这种情况下,当您尝试iomsg=时,您收到了消息"不存在的记录编号"。所以,问题解决了。

好吧,差不多。还有更多话要说。

您可能会惊讶地发现,您正在直接访问记录,但正在达到"没有记录"没有先到达文件结尾的状态"州。您正在使用评论"来测试(IOS .LT. 0)!到达文件结尾"。

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

如果检测到记录不是文件末尾的有效数字,您可以做些什么?可移植性不大,但来自iostat=的任何正数表示错误情况。但是,你现在知道这个特殊的5002意味着什么。

我还应该补充说,只有在没有成功的情况下,iomsg=的字符变量才由转移语句定义。只有在您知道转移失败时才考虑它。