Fortran 错误:单元连接到格式化文件

Posted

技术标签:

【中文标题】Fortran 错误:单元连接到格式化文件【英文标题】:Fortran Error: Unit connected to formatted file 【发布时间】:2016-10-11 21:36:02 【问题描述】:

在 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)

【问题讨论】:

@HighPerformanceMark 这导致了另一个错误:The REC= specifier must not appear in a list-directed or namelist data transfer statement. 【参考方案1】:

在 Fortran 中连接文件的 FORM 是“FORMATTED”(人类可读)或“UNFORMATTED”(非人类可读)。某些输入/输出语句的允许语法因文件而异 - 例如 FORMATTED 输入/输出语句将始终具有某种格式说明符,UNFORMATTED 输入/输出语句不得具有这样的说明符。

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

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

~~~

与连接的FORM与输入/输出语句的语法不一致一样,连接的ACCESS与语句之间也存在不一致。 ACCESS 指的是文件中记录的性质(以及如何“访问”这些记录):“SEQUENTIAL” - 文件包含可以按顺序访问的可变长度记录,“DIRECT” - 文件包含固定长度可以按任何顺序访问的记录,以及“STREAM” - 文件主要可以被视为文件存储单元(又名字节)的流(格式化的流文件也可以具有基于流中的换行符的记录结构) .

在示例中,文件连接的 ACCESS 明确指定为 SEQUENTIAL。但是,在 WRITE 语句(“将信息写入此特定记录”)中出现的 REC 说明符与 DIRECT ACCESS 连接是一致的。这种不匹配在符合标准的程序中是不允许的。

【讨论】:

这确实有助于澄清。你能解释一下 ACCESS 是什么意思吗?我知道将其指定为“直接”需要定义记录长度,但我遇到了错误,I/O 语句未完成,因为已到达记录的末尾。 我也忽略了连接的 ACCESS 和声明中的说明符也不一致。更多内容。

以上是关于Fortran 错误:单元连接到格式化文件的主要内容,如果未能解决你的问题,请参考以下文章

无法连接到数据库服务器:SQLSTATE [HY000]:一般错误:1835 格式错误的通信数据包 [重复]

无法连接到 OpenOffice 无头模式

Pro*Fortran 可以在 windows 上连接到 Oracle 10g 吗?

尝试使用 DAO 从外部 Access (Outlook/Excel) 连接到有效数据库会生成 3343 无法识别的数据库格式错误

Fortran 未格式化文件中的意外“填充”

自定义 uitablecell 无法将表格单元连接到文件所有者