Fortran读取非格式化文件报错:Expecting variable in READ statement
Fortran读取非格式化文件编译错误分析
问题重现
编译读取程序时执行命令:
gfortran -fdefault-real-8 -o avwmean2d2 avwmean2d2.f
报错信息:
Expecting variable in READ statement at (1)
错误指向read语句的嵌套隐含循环行。
写入文件代码
program avewmean REAL*8, ALLOCATABLE, DIMENSION (:) :: yc,zc INTEGER :: p1,p2,p3 ny=192 nz=192 ALLOCATE(yc(ny+1)) ALLOCATE(zc(nz+1)) open(11,file='wmean2d.x',form='unformatted') write (11) p3,p2 write (11) (((zc(k)),k=1,nz), . j=1,ny), . (((yc(j)),k=1,nz), . j=1,ny) close(11) stop end
读取文件代码
program avewmean REAL*8, ALLOCATABLE, DIMENSION (:) :: yc,zc INTEGER :: p1,p2,p3 ny=192 nz=192 ALLOCATE(yc(ny+1)) ALLOCATE(zc(nz+1)) open(11,file='wmean2d.x',form='unformatted') read (11) p3,p2 read (11) (((zc(k)),k=1,nz), . j=1,ny), . (((yc(j)),k=1,nz), . j=1,ny) close(11) stop end
错误原因
隐含循环语法差异:
Write语句允许无关联的嵌套隐含循环(比如j循环未索引zc数组,仅重复写入zc(1:nz)),但Read语句要求循环变量必须与接收变量有索引关联——编译器需要明确每个读取值的存储位置。你的read语句中j循环未绑定到存储变量,编译器无法识别有效接收对象,因此报错。写入逻辑本身不合理:
你写入的是zc(1:nz)重复ny次,以及yc(j)重复nz次,这既浪费文件空间,读取后还会导致yc数组的每个元素被覆盖nz次,最终仅保留最后一次读取的值,完全不符合正常的数组读写逻辑,大概率是写入代码的逻辑错误。
修正方案
方案1:修正读写逻辑(推荐)
如果原本是想一次性写入zc和yc的有效元素,简化读写语句:
修正后的写入代码片段:
open(11,file='wmean2d.x',form='unformatted') write(11) p3,p2 ! 注意:p3/p2需先初始化,否则写入随机值 write(11) zc(1:nz), yc(1:ny) close(11)
对应的读取代码片段:
open(11,file='wmean2d.x',form='unformatted') read(11) p3,p2 read(11) zc(1:nz), yc(1:ny) close(11)
方案2:按原错误写入逻辑读取(不推荐)
如果确实需要读取重复写入的内容,改用显式循环:
open(11,file='wmean2d.x',form='unformatted') read(11) p3,p2 ! 读取重复的zc(1:nz) ny次 do j=1,ny read(11) (zc(k), k=1,nz) end do ! 读取重复的yc(j) nz次,共ny次 do j=1,ny read(11) (yc(j), k=1,nz) end do close(11)
注意:这种方式下yc的每个元素会被覆盖nz次,最终值是最后一次读取的结果,无实际业务意义,仅为匹配原错误写入逻辑。
额外建议
- 显式声明所有变量:比如
integer :: ny, nz,避免默认类型带来的潜在问题。 - 写入前初始化
p3和p2,否则写入的是内存中的随机值,读取后无实际意义。
内容的提问来源于stack exchange,提问作者Mari
相关产品推荐
相关产品推荐

