You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fortran中如何使用while循环读取每行列数不固定的文本文件

Fortran可变列数文本文件读取实现

你原有代码硬编码了每次读取2个变量,仅适配固定2列的场景,针对每行列数不固定的1999行文本文件,核心处理逻辑是先将整行内容读入字符串缓冲区,再通过内部文件特性解析单行的列数与数值,避免硬编码读取变量列表的问题。

完整实现代码如下:

PROGRAM read_variable_col
IMPLICIT NONE
  ! 定义参数:最大行数字符串缓存长度,可根据实际调整
  INTEGER, PARAMETER :: MAX_ROWS = 1999, BUF_LEN = 1024
  CHARACTER(LEN=BUF_LEN) :: line_buf
  INTEGER, ALLOCATABLE :: tmp_arr(:)
  INTEGER :: row_idx, io_stat, val, col_count, pos

  ! 打开文件
  OPEN(UNIT=11, FILE='text.txt', STATUS='OLD', ACTION='READ', IOSTAT=io_stat)
  IF (io_stat /= 0) THEN
    PRINT *, '文件打开失败'
    STOP
  END IF

  ! 逐行读取处理
  DO row_idx = 1, MAX_ROWS
    ! 先读整行到缓存
    READ(11, '(A)', IOSTAT=io_stat) line_buf
    IF (io_stat /= 0) EXIT ! 读到文件末尾提前退出

    ! 统计当前行的列数,同时记录数值
    col_count = 0
    pos = 1
    DO
      ! 从当前指针位置读取数值
      READ(line_buf(pos:), *, IOSTAT=io_stat) val
      IF (io_stat /= 0) EXIT
      col_count = col_count + 1
      ! 移动指针到下一个数值的起始位置
      pos = pos + INDEX(line_buf(pos:), ' ')
      ! 跳过连续空格
      DO WHILE(line_buf(pos:pos) == ' ')
        pos = pos + 1
      END DO
    END DO

    ! 分配空间读取当前行所有数值
    ALLOCATE(tmp_arr(col_count))
    READ(line_buf, *) tmp_arr

    ! 此处可替换为你自己的业务处理逻辑,示例为打印行信息
    PRINT *, '第', row_idx, '行,列数:', col_count, ',内容:', tmp_arr

    DEALLOCATE(tmp_arr)
  END DO

  CLOSE(11)
END PROGRAM read_variable_col

关键逻辑说明:

  • 字符串缓冲区:BUF_LEN参数需要设置为大于单行最大字符数,可根据你的实际文件内容调整
  • 列数统计:通过从字符串缓存中循环读取整数直到IO报错,得到当前行的实际列数,无需提前预知列结构
  • 兼容性:如果需要持久化存储所有行数据,低版本Fortran可使用超大二维数组+单独的列数记录数组实现,Fortran2003及以上版本可直接使用可分配数组的数组存储
  • 性能优化:如果文件单行数据量极大,可以在第一次统计列数的同时就把数值存入可扩容数组,避免重复读取字符串内容

内容的提问来源于stack exchange,提问作者Timetraveler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 13:09:01