Fortran Error: Unit connected to formatted file

Fortran Error: Unit connected to formatted file

运行 AIX 上的 Fortran 90。尝试编译和 运行 这段代码,我收到一条错误消息:

The unformatted I/O statement on unit 200 cannot be completed because the unit is connected to the formatted file /filepath/TB_20160610023926_bufr_v620.dat.  
The program will recover by ignoring the I/O statement.

我不完全确定这个错误是什么意思。我只打开文件一次,单元号没有连接到任何其他文件。

INTEGER,PARAMETER :: GRID_TB_UNIT = 200
tbhmap=0

CALL SYSTEM('mkdir -p ' // TRIM(data_path) // '/' // &
                         TRIM(TB_PREFIX)   // '/' // &
                         date_str)

OPEN(UNIT   = GRID_TB_UNIT,             &
   file   = TRIM(TB_binary_filename),   &
   STATUS = 'REPLACE',                  &      
   ACCESS = 'SEQUENTIAL',               &
   FORM   = 'FORMATTED')                        

nrecg = 0
DO rr=1,720
 DO cc=1,1440

    IF(countgrid(cc,rr) < 1)CYCLE

    nrecg = nrecg+1

    tbhmap(cc,rr) = tbhgrid(cc,rr)/countgrid(cc,rr)
    timemap(cc,rr) = timegrid(cc,rr)/countgrid(cc,rr)

    GRID_TB_record%row = rr
    GRID_TB_record%col = cc
    GRID_TB_record%year = yeargrid(cc,rr)
    GRID_TB_record%month = monthgrid(cc,rr)
    GRID_TB_record%time = timemap(cc,rr)
    GRID_TB_record%tbh425 = tbhmap(cc,rr)

    WRITE(GRID_TB_UNIT,REC=nrecg)GRID_TB_record 

 END DO
END DO

CLOSE(GRID_TB_UNIT)

Fortran 中文件连接的格式是 "FORMATTED"(意味着人类可读)或 "UNFORMATTED"(人类不可读)。某些 input/output 语句的允许语法因文件而异 - 例如,FORMATTED input/output 语句将始终具有某种格式说明符,UNFORMATTED input/output 语句不得具有此类说明符。

您已将文件连接打开为 FORMATTED,但是有问题的 WRITE 语句没有必要的格式说明符 - 即 WRITE 语句的语法是用于 UNFORMATTED 连接的。如果没有格式说明符,编译器就不知道如何以人类可读的形式呈现 WRITE 语句的输出列表中的项目值。

如果您希望文件格式化 - 人类可读 - 然后将适当的格式说明符添加到 WRITE 语句(* 的格式说明符,如评论中所建议的,指定处理器相关的格式基于要使用的输出列表中的参数类型)。如果您不希望文件是人类可读的,则将 OPEN 语句中的 FORM 更改为 UNFORMATTED。

~~~

与连接的FORM 和input/output 语句的语法不一致类似,连接的ACCESS 和语句之间也存在不一致。 ACCESS 指的是文件中记录的性质(以及这些记录是如何 "accessed"):"SEQUENTIAL" - 文件包含可以按顺序访问的不同长度的记录,"DIRECT" - 该文件包含可以按任何顺序访问的固定长度记录,并且 "STREAM" - 该文件主要可以被视为文件存储单元流(a.k.a 字节)(FORMATTED STREAM 文件可以有一个记录结构也基于流中的换行符)。

在示例中,文件连接的 ACCESS 被明确指定为 SEQUENTIAL。但是,REC 说明符在 WRITE 语句 ("write the information to this particular record") 中的出现与 DIRECT ACCESS 连接一致。这种不匹配在符合标准的程序中是不允许的。