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

        读文件的时候有时候会遇到无法事先估计数据数目的情况。这个问题最传统的解决方法是声明一个“超级巨大”的数组来保存数据,而这个数组在使用时大部分空间都是闲置的。虽然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

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



        指针果然很好很强大啊,这只是一个很简单的小例子。但是串行方法也有一个缺点,就是只适合顺序读取数据,不适合作随机读取。比较好的编程方法是先用串行来读取文件,在获知文件大小之后将数据复制到一个可变大小的数组中,再把串行全部删除,这样就可以通过数组方便地进行查询了。


  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值