在Fortran 90程序中使用do循环来读取n帧的不同行数?

1 fortran fortran90

有一个文件有1000帧.每个帧包含不同数量的行.每行有两列整数.但是,我不知道每帧包含多少行.每个帧由一个空行分隔.我想读取这些值并将它们存储在一个数组中.但是,我无法分配数组大小,因为我不知道每帧有多少行.所以,我有两个问题:

  • 如何使用"do"循环读取fortran90程序中的不同行数?我不能使用"count-controlled do"循环,因为我不知道每帧中的确切行数.
  • 如果我之前无法分配数字,如何将数字存储在数组中?该文件看起来像这样:
1   2  
2   1

3   2

2   8   
4   5  
4   17  
2   10
Run Code Online (Sandbox Code Playgroud)

等等...

有什么建议?

Vla*_*r F 5

最简单的方法就是这样(如果需要,可以反转行和列的索引顺序,并为我跳过的所有变量添加声明以保持简短).它首先读取文件并确定行数.然后它将文件重新开始从头开始并读取已知的行数.

  integer,allocatable :: a(:,:)
  integer :: pair(2)
  integer :: unit

  unit = 11

  open(unit,file="test.txt")
  n = 0
  do
    read(unit,*,iostat=io) pair
    if (io/=0) exit
    n = n + 1
  end do

  rewind(unit)

  allocate(a(n,2))

  do i=1,n
    read(unit,*) a(i,:)
  end do

  close(unit)

  print *, a

end
Run Code Online (Sandbox Code Playgroud)

也可以使用临时数组完成一次通过解决方案,您可以轻松地扩展数组(C++向量在幕后也是如此).你甚至可以实现自己的成长课程,但这超出了这个问题的范围.