读取直接访问文件时 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=
的字符变量才由传输语句定义。只有当你知道传输失败时才考虑它。
我在用 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=
的字符变量才由传输语句定义。只有当你知道传输失败时才考虑它。