USE SUN_IO_HANDLERS SUBROUTINE SET_IO_ERR_HANDLER(IU, SUB_NAME, ISTAT) INTEGER(8) IU EXTERNAL SUB_NAME INTEGER(4) ISTAT
SUBROUTINE GET_IO_ERR_HANDLER(IU, SUB_PTR, ISTAT) INTEGER(8) IU EXTERNAL SUB_NAME POINTER (SUB_PTR, SUB_NAME) INTEGER(4) ISTAT
SET_IO_ERR_HANDLER 设置用户提供的子例程 SUB_NAME;在发生输入错误时,将使用该子例程作为逻辑单元 IU 的 I/O 错误处理程序。IU 必须是格式化文件的连接的 Fortran 逻辑单元。ISTAT 在有错误时将设置为一个非零值,否则设置为零。例如,如果在打开逻辑单元 IU 之前调用了 SET_IO_ERR_HANDLER,则 ISTAT 将设置为 1001(“非法单元”)。如果 SUB_NAME 为 NULL,则关闭用户错误处理,程序将恢复为缺省 Fortran 错误处理。
使用 GET_IO_ERR_HANDLER 可获取当前被用作此逻辑单元的错误处理程序的函数的地址。例如,调用 GET_IO_ERR_HANDLER 可在切换到其他处理程序例程之前保存当前的 I/O。以后可以使用保存的值恢复该错误处理程序。
SET_IO_ERR_HANDLER 和 GET_IO_ERR_HANDLER 是模块子例程,只能在调用例程中出现 USE SUN_IO_HANDLERS 时访问。
SUB_NAME 是用户提供的用于处理逻辑单元 IU 上的 I/O 错误的例程。运行时 I/O 库将所有相关信息传递到 SUB_NAME,使该例程可以诊断问题,并且还可能修复错误,然后再继续。
I/O 处理程序的接口如下:
SUBROUTINE SUB_NAME(UNIT, SRC_FILE, SRC_LINE, X DATA_FILE, FILE_POS, CURR_BUFF, X CURR_ITEM, CORRECT,CHAR, CORR_ACTION ) INTENT (IN) UNIT, SRC_FILE, SRC_LINE, DATA_FILE INTENT (IN) FILE_POS, CURR_BUFF, CURR_ITEM INTENT (OUT) CORRECT_CHAR, CORR_ACTION
发生错误的输入文件的逻辑单元。
发起输入操作的 Fortran 源文件的名称。
输入操作的 SRC_FILE 中的行号。
正在读取的数据文件的名称。此名称仅在打开的文件是外部文件时才可用。如果文件名不可用(例如,逻辑单元 5),则将 DATA_FILE 设置为零长度字符数据项。
输入文件中的当前位置(以字节数表示)。仅当输入文件 DATA_FILE 已知时才定义此参数。
包含输入记录中剩余数据的字符串,以坏的输入字符作为该字符串中的第一个字符。
错误发生时记录中已读取的输入项目数量(包括当前项目)。例如:READ(12,10)L,(ARR(I),I=1,L),如果在本例中 CURR_ITEM 值为 15,则表示当读取 ARR 的第 14 个元素时发生错误,L 是第一个项目,ARR(1) 是第二个项目,依此类推。
处理程序要返回的用户提供的更正字符。仅在 CORR_ACTION 参数设置为非零值时使用此参数。
如果 CORRECT_CHAR 设置为无效字符,则将重新调用处理程序例程,直到返回有效字符。如果处理程序永不提供有效字符,这可能会导致无限循环。需要用户进行检测以防止发生这种情况。
指定 I/O 运行时库要采取的纠正措施,可以有两个值:0,不执行任何操作。使用缺省的错误处理。1,继续使用用户错误处理程序例程返回的 CORRECT_CHAR。
I/O 处理程序只能将一个字符替换为另一个字符,不能将一个字符替换为多个字符。
错误恢复算法只能修复其当前读取的坏字符,不能修复已在其他上下文中被解释为有效字符的坏字符。例如,在列表控制读取中,如果输入为 "1.234509.8765"(正确输入应为 "1.2345 9.8765"),则 I/O 库将在第二个句点处发生运行错误,因为它不是一个有效数字;但是,此时无法返回将 '0' 更改为 <空白>。
当前,此错误处理功能对名称列表控制输入无效。在进行名称列表控制输入时,发生错误时将不会调用指定的 I/O 错误处理程序。
只能为外部文件设置 I/O 错误处理程序,不能为内部文件设置,因为没有与内部文件关联的逻辑单元。
仅为语法错误调用 I/O 错误处理程序,不为系统错误或语义错误(如输入值溢出)调用。
如果用户提供的 I/O 错误处理程序不停地向 I/O 库提供坏字符,导致其反复调用用户提供的 I/O 错误处理程序,则可能产生无限循环。如果在同一个文件位置不停地发生错误,则错误处理程序应自行终止。一种实现方法是通过将 CORR_ACTION 设置为 0 以采用缺省错误路径。然后,I/O 库就会继续进行正常错误处理了。
libfui.so sun_io_handlers.mod