回 帖 发 新 帖 刷新版面

主题:以二进制格式存储并读出二进制复数的问题

写复数到二进制文件代码:
Program main
Implicit None
Open( 12 , File = 'TestBinW.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 4 )
Write( 12 , Rec = 1 ) cmplx(1.23456789D-7,9.87654321D-8)
Close( 12 )
End Program main

从二进制文件中读出复数的代码:
Program main
Implicit None
complex(8) :: rVar1

Open( 12 , File = 'TestBinW.Bin' , Access = 'Direct' , Form = 'Unformatted' , RecL = 4)
Read( 12 , Rec = 1 ) rVar1
Write( * , * ) rVar1
Close( 12 )
pause
End Program main

不知何故,读取后显示的结果不是(1.23456789D-7,9.87654321D-8) ,而是 (5.002596306003016E-59,0.000000000000000E+00) ,烦请各位老师指教!

回复列表 (共11个回复)

沙发

RecL = 4
太短啦,至少也要16啊。

板凳

RECL=4不是正好4*4=16个字节吗,可以放得下一个双精度复数;事实上,即使换为RECL=16,读出的结果还是一样的错误。

3 楼

二进制文件我不是很熟悉, 不过想问问. 复数不是可以看成2个实数写入么? 会不会一个复数会占两个记录长度?

4 楼

用:
CMPLX(1.23456789D-7,9.87654321D-8,8)
或是:
DCMPLX(1.23456789D-7,9.87654321D-8)

5 楼

如楼上所言。

楼主的代码风格和我颇为相似。而且文件名跟我一个帖子里都一样,相信你是看过我的帖子。

你如果按照我帖子里介绍的,用 UltraEdit 看过生成的二进制文件就应该看到问题所在。

8B 8F 04 34 DF 18 D4 33 00 00 00 00 00 00 00 00

前 8 字节才有数据,后面 8 字节是 00,说明什么呢?说明实际的数据内容只有 8 字节。

6 楼

昨晚没有想到直接用complex(8)存储的方法,没办法,只好暂时用两个double类型分别存储complex(8)的实部和虚部,但读取的时候可以一次性读取为complex(8),将整个复数读出来。代码如下:
Program main
Implicit None
complex(8) :: var,var2(10)
integer :: i,n
n=10
var = dcmplx(1.23456789D-7,9.87654321D-8)
Open( 12 , File = 'TestBinW.Bin' , Access = 'Direct' , Form = 'unformatted' , RecL = 4 )
DO i=1,n
    Write( 12 , Rec = i )  dreal(i*var),dimag(i*var)
END DO
Close( 12 )
Open( 12 , File = 'TestBinW.Bin' , Access = 'Direct' , Form = 'unformatted' , RecL = 4*n )

READ(12,Rec=1) var2
write(*,*) var2
CLOSE(12)
pause
End Program main

7 楼

[quote]二进制文件我不是很熟悉, 不过想问问. 复数不是可以看成2个实数写入么? 会不会一个复数会占两个记录长度?[/quote]
经过楼上的代码试验是可以的,呵呵,不过这个方法有点笨

8 楼

[quote]用:
CMPLX(1.23456789D-7,9.87654321D-8,8)
或是:
DCMPLX(1.23456789D-7,9.87654321D-8)[/quote]
真是高人,原来把双精度复数按照单精度复数存储了,概念错误。用该方法已经成功解决了。

9 楼

[quote]如楼上所言。

楼主的代码风格和我颇为相似。而且文件名跟我一个帖子里都一样,相信你是看过我的帖子。

你如果按照我帖子里介绍的,用 UltraEdit 看过生成的二进制文件就应该看到问题所在。

8B 8F 04 34 DF 18 D4 33 00 00 00 00 00 00 00 00

前 8 字节才有数据,后面 8 字节是 00,说明什么呢?说明实际的数据内容只有 8 字节。[/quote]
石头兄更是从机理上证明了我是把双精度复数按照单精度复数存储了,只怪我对16进制的数据看着头晕,所以没有用UltraEdit探究。我正是看了石头兄的帖子才将其代码改为我需要的。高!

10 楼

楼主最好还是用recl=16喔,因为多数编译器认为16是字节而不是双字个数(只有INTEL编译器默认是认为一个单元是双字吧),而且INTEL编译器也可以通过设置来解决到底最小单元是字节还是双字:)

我来回复

您尚未登录,请登录后再回复。点此登录或注册