首页 文章

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

提问于
浏览
1

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

  • 3

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

    • 阅读编译器的文档(如果存在)

    • iomsg= 说明符与字符变量一起使用

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

    好吧,差不多 . 还有更多要说的 .

    您可能会惊讶于您在直接访问中依次浏览记录,但是在没有首先达到"end of file"状态的情况下达到"no record"状态 . 您正在使用评论"!End of file reached"测试 (IOS .LT. 0) .

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

    如果在文件末尾之外检测到记录不是有效数字,您可以做些什么?不多,可移植,但 iostat= 中的任何正数表示错误情况 . 但是,你现在知道这个特别的意思了.1668647 .


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

相关问题