simply fortran怎么对二进制文件进行读取?
2个回答
展开全部
以一个 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
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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询