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 连接一致。这种不匹配在符合标准的程序中是不允许的。
运行 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 连接一致。这种不匹配在符合标准的程序中是不允许的。