Fortran程序如何识别输入文件空白并按需跳转指定行?
实现Fortran程序筛选特定行的方案
当然可行!这在Fortran的文本处理场景里是完全可以实现的,咱们只需要逐行读取输入文件,根据预设的条件判断是否输出当前行就行。结合你给出的例子,我给你写一个针对性的代码方案:
示例代码
program filter_lines implicit none character(len=100) :: line real :: val1, val2, val3 real :: first_val1, first_val2, first_val3 logical :: first_line = .true. integer :: ios ! 打开输入文件,这里假设文件名为input.txt,可根据实际修改 open(unit=10, file='input.txt', status='old', action='read') ! 逐行读取直到文件末尾 do read(10, '(A)', iostat=ios) line if (ios /= 0) exit ! 读取到文件末尾或出错时退出循环 ! 解析行中的三个实数,格式不对的行直接跳过 read(line, *, iostat=ios) val1, val2, val3 if (ios /= 0) cycle if (first_line) then ! 第一行特殊处理:保存值并直接输出 first_val1 = val1 first_val2 = val2 first_val3 = val3 print *, val1, val2, val3 first_line = .false. else ! 按你的需求判断是否跳过当前行 ! 跳过条件:第一个值为4.0,或者与第一行完全相同的行 if (val1 == 4.0 .or. (val1 == first_val1 .and. val2 == first_val2 .and. val3 == first_val3)) then cycle ! 跳转至下一行,不输出 else print *, val1, val2, val3 end if end if end do close(10) end program filter_lines
代码说明
- 文件读取:用
open打开输入文件,unit=10是文件单元号,你可以根据自己的习惯调整;iostat用来捕获读取状态,确保到文件末尾时能正常退出循环。 - 第一行处理:单独保存第一行的三个数值,方便后续判断重复行。
- 跳过逻辑:根据你的例子,设置了两个跳过条件:第一个值为4.0的行(对应示例中的第二行),以及和第一行完全相同的行(对应示例中的第四行)。满足任一条件就用
cycle跳过当前行,不输出。 - 浮点数精度提示:如果你的输入数值存在精度误差(比如不是精确的1.0、4.0这类值),建议把直接相等判断改成精度范围内的比较,比如用
abs(val1 - 4.0) < 1e-6来替代val1 == 4.0,避免因精度问题导致判断错误。
你可以根据实际需求修改if语句里的判断逻辑——比如如果你的“特定值”是其他列的某个值,或者行内包含某个特定数值,只需要调整条件即可。
内容的提问来源于stack exchange,提问作者Riccardo Tobia
相关产品推荐
相关产品推荐

