Fortran读取文件

Fortran读取文件,第1张

具体表达为:

do

read(11,"(A46)",iostat=stat1) filename

if(stat1/=0) exit

end do

通过 if(stat1/=0) exit 就可以判断是否已经读取到文件的结尾,从而完成循环的 *** 作。

以一个 m x n 矩阵 A 为例,介绍Fortran二进制文件的读写

1、打开与关闭文件:open/close

open(unit=99,file='data.dat',access='direct',form='unformatted',recl=8)

close(99)

其中:

unit=99 ! 设备号,Fortran 77规定取值范围为1~99

file='data.dat' ! 文件名

access='direct'  ! 以直接访问的方式 *** 作文件

form='unformatted' ! 以无格式方式进行 *** 作,当access='direct'时,form缺省为'unformated'

recl=8  ! 每个记录的大小

上面比较重要的是 recl,我们读写数据时,每次读写的是一个记录,长度就由recl指定,

一般表示字节数,如recl=8表示记录长度为8个字节。

但在某些旧的编译器下以4个字节为单位,如recl=2表示记录长度为8字节,

这个问题需要参考编译器手册,我们这里是以字节为单位。

2、写数据:write

write(99,rec=k) A(i,j)  ! 将 A(i,j) 作为第 k 条记录写入到文件中

这里的 rec 表示记录的序号,每次只能写入一个记录,但长度可以自己定。

将一个双精度矩阵写入文件,可以有下面三种方式实现:

(1) 将每个元素看成一个记录,recl=8

      open(unit=99,file='data.dat',access='direct',form='unformatted',

     &     recl=8)

      k = 0

      do j=1,n

         do i= 1,m

            k=k+1

            write(99,rec=k) A(i,j) 

         enddo

      enddo

      close(unit=99)

(2) 把一列看成一个记录,长度为 8*m

 

 open(unit=99,file='data.dat',access='direct',form='unformatted',

     &     recl=8*m)

      do j=1,n

         write(99,rec=j) A(1,j) 

      enddo

      close(unit=99)

(3) 把整个看成一个记录,长度为 8*m*n

      open(unit=99,file='data.dat',access='direct',form='unformatted',

     &     recl=8*m*n)

      write(99,rec=1) A 

      close(unit=99)

3、读数据:read

read(99,rec=k) B(i,j) ! 将第k个记录读入到 B(i,j) 中

我们可以通过下面三种方式读一个矩阵

(1) 将每个元素看成一个记录,recl=8

   open(unit=99,file='data1.dat',access='direct',form='unformatted',

     &     recl=8)

      k = 0

      do j=1,n

         do i= 1,m

            k=k+1

            read(99,rec=k,iostat=ferr) A(i,j) 

         enddo

      enddo

      close(unit=99)

(2) 把一列看成一个记录,长度为 8*m

 

 open(unit=99,file='data1.dat',access='direct',form='unformatted',

     &     recl=8*m)

      do j=1,n

         read(99,rec=j,iostat=ferr) (A(i,j), i=1,m)

      enddo

      close(unit=99)

(3) 把整个看成一个记录,长度为 8*m*n

     open(unit=99,file='data1.dat',access='direct',form='unformatted',

     &     recl=8*m*n)

      read(99,rec=1,iostat=ferr) ((A(i,j), i=1,m), j=1,n)

      close(unit=99)

4、读取整个文件

     open(unit=99,file='data.dat',access='direct',form='unformatted',

     &     recl=8)

      k = 0

      do while (.true.)

         k = k + 1

         read(99,rec=k,iostat=ferr) x(k)

         if (ferr/=0) exit

      enddo

open(11,file='**.**') ! 要读取的文件

open(12,file='**.**') !存储第一类数据的文件

open(13,file='**.**') !存储第二类数据的文件

open(14,file='**.**') !存储第三类数据的文件

open(15,file='**.**') !存储第四类数据的文件

do i=1,300

read(11,*) x

write(12,*) x

end do

close(12)

do i=301,601

read(11,*) x

write(13,*) x

end do

close(13)

do i=602,902

read(11,*) x,y,z

write(14,*) x,y,z

end do

close(14)

do i=903,1202

read(11,*) x,y,z

write(15,*) x,y,z

end do

close(15)

close(11)

stop

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11467378.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存