如何避免Fortran READ语句读取输入时跳过数据
解决Fortran格式化读取数据时的EOF错误问题
问题原因
你的程序出错是因为格式读取的字段匹配逻辑:
- 格式
900 FORMAT(6F10.6)要求每行处理6个F10.6格式的字段,但你的循环每次仅读取NY个数据到A(:,J)。 - 当
NY不是6的整数倍时,每次读完NY个数据后,当前行剩余的6-NY个字段会被Fortran的格式读取机制直接跳过,不会被后续读取。 - 最终导致实际读取的数据总量远小于
NX*NY,数组未填满就触发文件结束错误。
解决方案
方法1:一次性读取所有数据到临时一维数组
先把文件中所有数据读取到一个一维数组,再转存到目标二维数组,彻底避免行内字段跳过的问题:
INTEGER NX, NY PARAMETER (NX=..., NY=...) ! 替换为你的实际维度值 DIMENSION TEMP(NX*NY), A(NY,NX) OPEN (UNIT=33, STATUS='OLD') READ(33,900) TEMP ! 一次性读取所有数据 CLOSE(33) ! 将一维数组转存到二维数组,保持原程序的索引顺序 DO 100 J=1,NX DO 200 I=1,NY A(I,J) = TEMP( (J-1)*NY + I ) 200 CONTINUE 100 CONTINUE 900 FORMAT(6F10.6)
方法2:使用嵌套隐式DO循环直接读取
更简洁的方式是用嵌套隐式DO循环一次性读取整个二维数组,格式会自动跨行连续处理字段,不会跳过任何数据:
INTEGER NX, NY PARAMETER (NX=..., NY=...) ! 替换为你的实际维度值 DIMENSION A(NY,NX) OPEN (UNIT=33, STATUS='OLD') READ(33,900) ((A(I,J), I=1,NY), J=1,NX) ! 按原顺序读取所有元素 CLOSE(33) 900 FORMAT(6F10.6)
注意事项
- 确保文件中确实包含恰好
NX*NY个F10.6格式的数据,如果文件本身数据量不足,仍会触发EOF错误。 - 两种方法都兼容旧版Fortran标准,不需要修改文件格式。
内容的提问来源于stack exchange,提问作者jon_burns
相关产品推荐
相关产品推荐

