回 帖 发 新 帖 刷新版面

主题:一个二进制的小问题

编译器:gfortran
code1:
open(11,file=fn, access='direct', recl=m*n*4)
read(11,rec=1)u
read(11,rec=2)v


code2:
open(11,file=fn, form='unformatted',access='sequential')
read(11)u
read(11)v


我觉得上面这两段话应该能读出来一样的东西啊,为什么第二段一个值都还没读它就跟我说end of file 了呢?

谢谢

回复列表 (共5个回复)

沙发

code1 读的是文本文件
code2 读的是二进制文件

如果读的是二进制文件,且才用顺序读取。那么你的文件格式必须是:

[color=green]04 00 00 00 XX XX XX XX 04 00 00 00 [/color][color=red]04 00 00 00 YY YY YY YY 04 00 00 00[/color]

[color=green]其中前 12 字节是第一次 read,XX XX XX XX 是 u 的二进制表示法[/color]
[color=red]后12字节是第二次 read,YY YY YY YY 是 v 的二进制表示法[/color]

XX YY 前面和后面的 04 00 00 00 表示这笔记录长度是 4 字节。

如果没有 04 00 00 00 ,就直接是 XX XX XX XX,那么编译器会认为这笔记录长度有 XX 个字节(如果XX是浮点数,那么按照整型读取的结果就是一个非常大的数字,编译器认为这笔记录很大,很长),而文件并没有那么大。造成遇到文件尾部。

板凳

谢谢石头大哥,看了你的回答,又看了网上的其他一些东西http://local.wasp.uwa.edu.au/~pbourke/dataformats/fortran/。我的问题已经完全解决了。再加上自己试验了一下,发现顺序写的二进制确实要比按块写的大几个字节数。
我感觉还是不要顺序写的好,不然其他程序读这些二进制会很费劲,因为会把表示记录长度的数也读进去。不知道这样想对不对?

3 楼

按块写好像不太对,应该叫直接写。顺序写它也是按块写的

4 楼

各有优缺点。

顺序写的话,你可以不必指定RECL,也不必每个RECORD一样长度。

直接读取的话,你可以跳到某个指定的记录直接读取,但必须指定RECL长度。

所以根据你的需要吧。

我一般是文本文件顺序读取,二进制文件直接读取。

5 楼

好,知道了,谢谢

我来回复

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