如何在FORTRAN中读取具有未知结构的数据文件?

时间:2012-01-06 01:37:34

标签: input fortran

我需要读取包含未定义数量的单元格的文件,并为每个单元格读取未知数量的数据对。我正在使用Fortran。

该文件如下:

Cell Number 1
Depth1 Volume1
Depth2 Volume2
Depth3 Volume3
.
.
.
Cell Number N
Depth1 Volume1
Depth2 Volume2
Depth3 Volume3
Depth4 Volume4
Depth5 Volume5

有人能帮助我吗?

2 个答案:

答案 0 :(得分:4)

正如@yosukesabia所回答的那样,你可能想要使用读取字符串的标准方法,然后查看字符串以决定你刚读取的内容,然后根据字符串进行内部读取。

但是一旦你阅读了数据,还存在如何存储数据的问题...... 由于每个单元格都有未知数量的单元格和未知数量的数据项,因此最优雅的方法是为每个单元格创建链接列表类型。要获得单元格列表,并在遇到新单元格时添加到该列表。并且单元格类型本身包含单元格数据类型列表。当您遇到新数据项时,您将添加到该列表。链表可能是处理未知数量项目的最佳方式。最近一个问题涉及Fortran中的链接列表:How can I implement a linked list in fortran 2003-2008。否则,您可以读取文件,倒带或退格,并分配正确大小的数组,然后重新读取。原始方法是具有类型的固定长度数组,以最大可能数量的单元格大小,以及每个单元格的最大可能数据项数量。简单,但非常优雅。如果您对最大数字的猜测是错误的,那就容易出错。

答案 1 :(得分:2)

你正在使用哪个版本的fortran? 95?

以字符(len = 1000)或足够长的时间读入,然后从该变量中读取。

program xx
character(len=1000) :: buf
integer :: celnum
open(11,file='dat.txt',status='old')

do
   read(11,'(a)') buf
   print*,buf(1:12)
   if (buf(1:12)=='Cell Number ') then
     read(buf(13:1000), *) celnum
     print *, celnum
   elseif (buf(1:5) == 'Depth') then
     ! here it is not clear what I am suppose to read
   else
     print*,'que?'
     stop
   endif

enddo
end