在此代码中
read(unit,'I0',err=100) my_integer
100 error_stop "Something went wrong."
100
err 说明符告诉程序,如果从具有单位标识符的文件中读取整数时出现错误,则转到标有的语句unit
。
有没有其他方法可以处理这种错误?我知道一些变通方法,比如用它来inquire
判断文件是否存在,或者用其他方法检测文件结尾。但是像我这种尝试读取整数却因为某种原因无法读取的情况,还有其他方法可以捕获这个错误吗?
我之所以问这个问题,是因为使用语句标签似乎有些过时了。或许这只是我的假设,因为goto
语句标签已经过时了。如果我错了,请纠正我。
(几乎)所有 Fortran 的输入/输出语句都采用
iostat=
和iomsg=
说明符。1如果输入/输出语句中没有错误条件、文件结束条件或记录结束条件,则任何此类
iostat=
说明符都表示状态变量被定义为0
。同样,任何此类iomsg=
说明符都不会改变相应的变量。2该问题的 READ 语句最基本的形式可能是这样的(注意格式上的两处更正):
但是,
err=
表示执行流在发生错误时跳转,而status
可能为非零,表示文件结束条件(对应于end=
)。内部模块 ISO_FORTRAN_ENV 提供了 IOSTAT_END 常量,可用于测试是否存在文件结束条件且无错误条件:回想一下,记录结束条件(对应于
EOR=
)仅发生在非前进读取中。输入/输出状态数字本质上毫无意义。
iomsg=
虽然对人类更有帮助,但仍然不可靠。1 PRINT 语句与 WRITE 语句不同,它不接受控制信息列表;READ 语句的一种形式也不接受控制信息列表。READ 语句的另一种形式,例如 BACKSPACE、CLOSE、ENDFILE、FLUSH、INQUIRE、OPEN、REWIND、WAIT 和 WRITE 都接受这些说明符。
2确切地说,这意味着定义状态保持不变,并且值(如果有)也保持不变。如果您要依赖于测试 IO 消息的值,请确保在输入/输出语句之前定义它。