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 格式错误的通信数据包 [重复]
Pro*Fortran 可以在 windows 上连接到 Oracle 10g 吗?
尝试使用 DAO 从外部 Access (Outlook/Excel) 连接到有效数据库会生成 3343 无法识别的数据库格式错误