主题:一个二进制的小问题
bellanchor
[专家分:0] 发布于 2010-12-01 10:45:00
编译器: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个回复)
沙发
臭石头雪球 [专家分:23030] 发布于 2010-12-05 20:35:00
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是浮点数,那么按照整型读取的结果就是一个非常大的数字,编译器认为这笔记录很大,很长),而文件并没有那么大。造成遇到文件尾部。
板凳
bellanchor [专家分:0] 发布于 2010-12-07 17:08:00
谢谢石头大哥,看了你的回答,又看了网上的其他一些东西http://local.wasp.uwa.edu.au/~pbourke/dataformats/fortran/。我的问题已经完全解决了。再加上自己试验了一下,发现顺序写的二进制确实要比按块写的大几个字节数。
我感觉还是不要顺序写的好,不然其他程序读这些二进制会很费劲,因为会把表示记录长度的数也读进去。不知道这样想对不对?
3 楼
bellanchor [专家分:0] 发布于 2010-12-07 17:30:00
按块写好像不太对,应该叫直接写。顺序写它也是按块写的
4 楼
臭石头雪球 [专家分:23030] 发布于 2010-12-08 20:22:00
各有优缺点。
顺序写的话,你可以不必指定RECL,也不必每个RECORD一样长度。
直接读取的话,你可以跳到某个指定的记录直接读取,但必须指定RECL长度。
所以根据你的需要吧。
我一般是文本文件顺序读取,二进制文件直接读取。
5 楼
bellanchor [专家分:0] 发布于 2010-12-09 09:00:00
好,知道了,谢谢
我来回复