我在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 回答
iostat=
说明符返回的非零值不能跨编译器移植 . 如果您想确定特定代码的含义,那么您有两个选择:阅读编译器的文档(如果存在)
将
iomsg=
说明符与字符变量一起使用在这种情况下,当您尝试
iomsg=
时,您收到了消息"Non-existing record number" . 所以,问题解决了 .好吧,差不多 . 还有更多要说的 .
您可能会惊讶于您在直接访问中依次浏览记录,但是在没有首先达到"end of file"状态的情况下达到"no record"状态 . 您正在使用评论"!End of file reached"测试
(IOS .LT. 0)
.读取为直接访问而连接的文件时,不会出现文件结束条件 .
如果在文件末尾之外检测到记录不是有效数字,您可以做些什么?不多,可移植,但
iostat=
中的任何正数表示错误情况 . 但是,你现在知道这个特别的意思了.1668647 .我还应该补充一点,只有在没有成功的情况下,
iomsg=
的字符变量才由transfer语句定义 . 只有在您知道传输失败时才考虑它 .