【问题标题】:GFortran I/O error 5002 while reading a direct access file读取直接访问文件时出现 GFortran I/O 错误 5002
【发布时间】:2016-12-01 12:01:11
【问题描述】:

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

【问题讨论】:

  • 你的意思是ios的值是5002?
  • 是的,ios的值为5002。
  • 我尝试使用 IOMSG= 并显示不存在的记录号。
  • 现在我认为问题很清楚了 - 没有留下任何记录。感谢@francescalus 和他获得描述性信息的建议。
  • integer*4 不是有效的 Fortran。它从来都不是任何 ISO Fortran 标准的一部分。

标签: fortran gfortran


【解决方案1】:

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

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

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

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

您可能会惊讶地发现,您在直接访问中依次遍历记录,但在没有首先达到“文件结束”状态的情况下达到“无记录”状态。您正在测试 (IOS .LT. 0) 并带有评论“!文件已到达结束”。

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

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


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-15
    • 2012-04-14
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多