Fortran中如何跳过固定行数,仅读取每第十组数据行?
解决Fortran中读取大型文件每第十组行的问题
你的原代码问题在于:DO循环的步长10只是让循环变量T每次增加10,但每次循环里的三次READ还是会连续读取文件的行,并没有跳过中间的9组数据。比如第一次循环读第1-3行,第二次循环接着读第4-6行,完全没达到“每第十组读一组”的效果。
下面是两种可行的解决方法:
方法一:读完目标组后跳过剩余9组
每次读取完目标的3行数据后,通过一个内部循环跳过接下来的9组(共27行),这样就能精准定位到下一个第十组的起始位置:
IMPLICIT NONE INTEGER :: T, skip REAL(8) :: RR, RS, RT OPEN(UNIT=11, FILE='test.dat', STATUS='UNKNOWN', ACTION='READ') DO T = 1, 1000, 10 ! 读取当前目标组的3行数据 READ(11, *) RR READ(11, *) RS READ(11, *) RT ! 这里可以添加对RR/RS/RT的处理逻辑,比如打印、存储等 PRINT *, "第", T, "组数据:", RR, RS, RT ! 跳过接下来的9组数据(每组3行,共27行) ! 最后一组不需要跳过,避免超出文件范围 IF (T /= 1000) THEN DO skip = 1, 27 READ(11, *) ! 仅读取不存储,实现跳行 ENDDO ENDIF ENDDO CLOSE(11) END PROGRAM TRACE
方法二:带文件末尾错误处理的版本
如果你的文件可能不足1000组,建议添加IOSTAT参数处理文件读取到末尾的情况,避免程序崩溃:
IMPLICIT NONE INTEGER :: T, skip, iostat REAL(8) :: RR, RS, RT OPEN(UNIT=11, FILE='test.dat', STATUS='UNKNOWN', ACTION='READ') DO T = 1, 1000, 10 ! 读取目标组,检查是否读取成功 READ(11, *, IOSTAT=iostat) RR IF (iostat /= 0) EXIT ! 读取失败(比如到文件末尾)则退出循环 READ(11, *, IOSTAT=iostat) RS IF (iostat /= 0) EXIT READ(11, *, IOSTAT=iostat) RT IF (iostat /= 0) EXIT PRINT *, "第", T, "组数据:", RR, RS, RT ! 跳过9组,同时检查读取状态 IF (T /= 1000) THEN DO skip = 1, 27 READ(11, *, IOSTAT=iostat) IF (iostat /= 0) EXIT ENDDO IF (iostat /= 0) EXIT ENDIF ENDDO CLOSE(11) END PROGRAM TRACE
内容的提问来源于stack exchange,提问作者user18462847
相关产品推荐
相关产品推荐

