您的位置:首页 > 其它

fortran读文本文件—无法估计数据数目问题

2013-09-18 10:07 225 查看
        读文件的时候有时候会遇到无法事先估计数据数目的情况。这个问题最传统的解决方法是声明一个“超级巨大”的数组来保存数据,而这个数组在使用时大部分空间都是闲置的。虽然fortran可以支持可变大小的数组(allocatable),但是这种数组在使用之前也必须确定大小才能分配内存。

        C/C++里面可以通过指针来创建动态数组,现在fortran也支持指针,是不是也可以由类似的应用呢?答案是肯定的。fortran里面也可以通过指针来创建“串行结构”,可以配合需要向内存要求刚好的空间,只有一条数据时就要求一条数据的空间,有一千条数据时就要求一千条数据的空间,这样就可以有效地使用内存。

        下面通过一个例子来说明。要读取的数据放在一个叫data.txt的文本文件中,现在知道文件中有四列数据,但不知道文件中有几行数据。

        这是数据:



        下面是读取代码:

module linklist
implicit none
type::datalink
real*8::item(1:4) !声明一个1*4的数组用来存放一行数据
type(datalink),pointer::next !声明指针,用于指向下一条数据
end type
end module linklist

program readlinebyline
use linklist
implicit none
character*20 :: filename
integer::datasize,error,i

type(datalink),pointer::head,p

filename="data.txt"

open(10,file=filename,status="old",iostat=error)
if(error/=0) then
write(*,*) "Open file fail!"
stop
end if

allocate(head) !给head分配内存
nullify(head%next) !使head%next指向为空
p=>head

do while(.true.)
read(10,fmt=*,iostat=error) p%item  !读取一行数据赋给p%item
if(error/=0) exit
datasize=datasize+1 !datasize用于统计行数
allocate(p%next,stat=error) !添加下一个数据
if(error/=0) then
write(*,*) "Out of memory!"
stop
end if
p=>p%next !移动到下一行数据
nullify(p%next)

end do
close(10)

write(*,'("The total number of lines:",I3)') datasize

p=>head
do while(.true.)
write(*,*) p%item
if(.not. associated(p%next)) exit !如果p%next没有设置指向,就退出
p=>p%next
end do
end program readlinebyline


        程序中的注释应该写得很清楚了,按行读取数据,最后输出在屏幕上,结果如下:



        指针果然很好很强大啊,这只是一个很简单的小例子。但是串行方法也有一个缺点,就是只适合顺序读取数据,不适合作随机读取。比较好的编程方法是先用串行来读取文件,在获知文件大小之后将数据复制到一个可变大小的数组中,再把串行全部删除,这样就可以通过数组方便地进行查询了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fortran 指针 串行
相关文章推荐