fortran open使用
来源:互联网 发布:淘宝怎么上传详情页 编辑:程序博客网 时间:2024/06/07 06:28
1)--------------------------------------------------------------------------------------
FOR的输出分 有格式form = 'formatted'、无格式form = 'unformatted'两种,前者是默认输出格式,即如果open语句里不声明form的话,那就是formatted。
无格式又分 直接存取access = 'direct'、间接存取access = 'seuqential' 两种,后者是无格式文件的默认格式。
几个open示例:
有格式文件:
open( 1, file = '...', status = 'new', form = 'formatted' )
或者
open( 1, file = '...', status = 'old')
无格式/顺序文件:
open( 1, file = '...', status = 'new', form = 'unformatted', access = 'sequential' )
或者
open( 1, file = '...', status = 'new', form = 'unformatted' )
无格式/直接文件:
open( 1, file = '...', status = 'new', form = 'unformatted', access = 'direct', recl = ... )
2)--------------------------------------------------------------------------------------
如果是向 有格式文件 输出,则write语句可以写成:表控格式,如write( 1,* ) var; 或者显式说明格式,如write( 1,'(5i2)' ) var
如果是向 无格式/顺序文件 输出,则write语句应写成: write( 1 ) var
如果是向 无格式/直接文件 输出,则write语句应写成: write( 1, rec = k ) var
3)--------------------------------------------------------------------------------------
对于 无格式/直接文件 , open中的recl指明了一个输出记录的长度。它具体等于多少要看输出write语句如何写,同时write语句中的记录号rec也要写正确。
比如有一个m(20,30)的二维数组,可以有如下几种写法(注意recl, rec, m的变化):
a) 把整个数组看作一个记录(1个记录,1个记录长度20*30):
open ( 1, file = '...', status = 'new', form = 'unformatted', access = 'direct', recl = 20*30 )
write( 1, rec = 1 ) m
b) 把一行看作一个记录(20个记录,1个记录长度30):
open ( 1, file = '...', status = 'new', form = 'unformatted', access = 'direct', recl = 30 )
do k = 1, 20
write( 1, rec = k ) ( m( k, p ), p = 1, 30 )
end do
c) 把一个数组元素看作一个记录(20*30个记录,1个记录长度1):
open ( 1, file = '...', status = 'new', form = 'unformatted', access = 'direct', recl = 1 )
k = 0
do i = 1, 20
do j = 1, 30
k = k + 1
write( 1, rec = k ) m( i, j )
或者
write( 1, rec = (i-1)*30+j ) m( i, j )
end do
end do
顺说一句,二维数组是先存列再存行的,所以上述a)打印m元素的顺序与c)不同,而与下述d)相同
d) 把一个数组元素看作一个记录:
open ( 1, file = '...', status = 'new', form = 'unformatted', access = 'direct', recl = 1 )
k = 0
do j = 1, 30
do i = 1, 20
k = k + 1
write( 1, rec = k ) m( i, j )
或者
write( 1, rec = (j-1)*20+i ) m( i, j )
end do
end do
在一些旧的FOR编译器中(比如Fortran PowerStation 4.0),对recl解释成字长而非字节,因此还需要将recl乘以4才能正确读取。现在常用的CVF编译器已不需要这样做。
PS:你的33个数据可能并没有分放在3行半上。可能只是记事本查看的原因,当一屏显示不下时自动换行显示,但数据可能还是在一行上。所以要读取的话可试试直接写成:
write( 1, * ) ( m( k ), k = 1, 33 )
如果m一开始就声明成一个只有33个元素的数组,则也可写成
write( 1, * ) m
4)--------------------------------------------------------------------------------------
二进制存放的数据还有一个反位的问题。一般在UNIX机上是二进制数是高位结束,在WIN和LINUX中是低位结束(没记错的话)。如果读数时出现很大的怪数,比如1.e+35之类,或者执行时显示读取文件到末尾,或者是记录不够长,并且你又确定程序没错,那么多半是反位问题的原因。
这时如果你用的编译器有反位选项,可以加上,比如ifort编译器可以写:
ifort -convert big_endian xxx.f90 或
ifort -convert little_endian xxx.f90
也可以直接在FOR程序的OPEN语句中说明,比如:
open( 1, file='...', form='unformatted', access='direct', recl=..., convert='big_endian' )
或
open( 1, file='...', form='unformatted', access='direct', recl=..., convert='little_endian' )
big_endian 适用于在本地PC读取UNIX服务器上生成的二进制数据。
little_endian适用于在UNIX服务器读取本地PC生成的二进制数据。
- fortran open使用
- Fortran之open,write,read,inquire,Namelist 使用
- Fortran之open,write,read,inquire,Namelist 使用
- 高效使用FORTRAN数组
- Fortran中的指针使用
- fortran 语言使用
- Fortran
- fortran
- fortran
- Intel Fortran使用IMKL
- Visual Fortran 中使用Matlab引擎心得
- 在Fortran MEX中使用Intel MKL
- 在FORTRAN程序中使用shell命令
- fortran使用netcdf 读写NC文件
- fortran F90动态数组的基本使用示范
- 配置 NetBeans IDE 以使用 C/C++/Fortran
- 配置 NetBeans IDE 以使用 C/C++/Fortran
- f2py::演示在python中如何使用Fortran代码
- Git常用命令(转)
- HIVE 自定义函数 UDF
- 不要停留在表面 --论程序员的专研精神
- linux下c通过虚拟地址映射读写文件
- Java线程:新特征-线程池
- fortran open使用
- 中国远征军灵位首次归国
- Windows编程入门(5)MFC程序最小托盘化
- Java线程池学习
- SSH Secure Shell Client中文乱码的解决方法
- 线程池ThreadPoolExecutor使用简介
- ring0实现进程的隐藏
- 白求恩在中国嫖娼竟被加拿大老乡举报
- [Unity3D]手机3D游戏开发:简单的移动和缩放鼠标手势脚本源码