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
相关产品推荐
相关产品推荐

