Fortran用stream流读取二进制文件问题
第一次在fcode发帖,初学fortran,如有不足请指教。现有两个文件内容都是一样的,一个是有格式文件(*.FGRID)一个是无格式二进制文件(*.GRID),其中有格式文件我用Editplus打开,内容如下:
'DIMENS' 3 'INTE'
10 10 25
无格式二进制文件,我想用Fortran的stream流打开,但是未能得到跟上边同样的结果,运行后我得到结果是:
DIMENS 50331648 INTE
268435456 201326592 167772160
主要是我要的整数 3 10 10 25 这几个数怎么一下变得那么大了呢? 不明白,怎么解决呢?!
请大牛指教啊》》》》》》》》》》》》》》》》
百思不得其解,我的fortran代码如下:
Program www_fcode_cn
Use, Intrinsic :: ISO_C_BINDING !// 使用内部模块,保持与 C 语言变量类型一致
Implicit None
character(len=4) :: flag0 !// 4字节
character(len=8) :: flag1 !// 8字节
character(len=4) :: dtype !// 数据类型
integer*4 :: i,j,k
integer*4 :: ii,jj,kk
Open( 12 , File = "INJECTWATER_FORWUNAN.GRID" , access="stream" , form = "unformatted" )
Read( 12 ) flag0,flag1,i,dtype
Write( * , * ) flag1,i,dtype
Read( 12 ) ii,jj,kk
Write( * , * ) ii,jj,kk
!Inquire( 12 , Pos = i )
!Write( * , * ) i
Close( 12 )
End Program www_fcode_cn
以上为我的代码,是哪个地方出问题了呢?! 望求解,谢谢。
把文件传上来 fcode 发表于 2015-7-30 19:19
把文件传上来
共两个文件,见压缩包。
fcode 发表于 2015-7-30 19:19
把文件传上来
,见压缩包,谢谢。 您的问题有两个:
1.您的数据是一个无格式顺序文件。所以如果你要用 stream 读取,需要在每个 read 前后各加一个 n。
之前你的代码在前面加了 flag0,但没有在后面加
2.您的数据是一个大端字节序(big-endian),而你的编译器是默认小端字节序的(little-endian),您需要在 Open 的时候指定为大端字节序。
当然,指定的方法不标准,因为语法没有规定大小端字节序。如果以下的代码在你的编译器上不支持,请告诉我你使用什么编译器,我再为你查找方法。
Program www_fcode_cn
Implicit None
character(len=8) :: flag1 !// 8字节
character(len=4) :: dtype !// 数据类型
integer(kind=4) :: i,j,k,n
integer(kind=4) :: ii,jj,kk
Open( 12 , File = "INJECTWATER_FORWUNAN.GRID" ,convert='BIG_ENDIAN', access="stream" , form = "unformatted" )
Read( 12 ) n,flag1,i,dtype,n
Write( * , * ) flag1,i,dtype
Read( 12 ) n,ii,jj,kk,n
Write( * , * ) ii,jj,kk
Close( 12 )
End Program www_fcode_cn 非常感谢fcode的耐心解答,明天我试一下。 fcode 发表于 2015-7-30 22:19
您的问题有两个:
1.您的数据是一个无格式顺序文件。所以如果你要用 stream 读取,需要在每个 read 前后各 ...
fcode你好:-),感谢你的解答,用了你给我的代码,问题已解决,以后有不懂还得向你请教,太感谢了!
我现在用simply fortran,非常感谢论坛。 回顾当年的问答,现在依然获益匪浅!!!:-)
页:
[1]