Fortran Coder

标题: fortran二进制文件读取 [打印本页]

作者: 1035326373    时间: 2014-10-14 21:53
标题: fortran二进制文件读取
我在处理数据过程中,由于数据量较大,数据一般以二进制形式保存。现已知数据十进制的形式。十进制的格式诸如:format (4h 0v ,a8, 1h*, 2a8, 1h*, i6),或者format (4h 5d ,a8 , 1p, 2e12.5/( 2e12.5, 5i6)).求详细方法。

作者: fcode    时间: 2014-10-15 08:07
我建议你先不要学习如何写代码,而是先学习一下二进制文件的基础。它是无数据格式的,这一点很重要。

推荐阅读 http://fcode.cn/guide-4-1.html
作者: 1035326373    时间: 2014-10-24 11:34
fcode 发表于 2014-10-15 08:07
我建议你先不要学习如何写代码,而是先学习一下二进制文件的基础。它是无数据格式的,这一点很重要。

推荐 ...

我在学习你推荐的文章过程中,将271 , 783 , 2.5811919E+3 , 1.6892716E-7 , ABCDEFGHIGKLMNOP写入二进制文件时,为什么显示的和文章中的不一样。

捕获.PNG (8.36 KB, 下载次数: 318)

捕获.PNG

作者: 楚香饭    时间: 2014-10-24 22:18
不要重复发帖。

你估计用的是:无格式顺序读取,而文中用的是无格式直接读取。注意  Access = 'Direct'
作者: 1035326373    时间: 2014-12-17 16:50
楚香饭 发表于 2014-10-24 22:18
不要重复发帖。

你估计用的是:无格式顺序读取,而文中用的是无格式直接读取。注意  Access = 'Direct'  ...

直接读取的第一个记录与顺序读取时第一个read读取的内容不一致,是不是顺序方式写入的文件不能直接读取?
作者: fcode    时间: 2014-12-17 16:56
顺序方式写入的文件里,每个记录前后会多 4 字节,表示该记录的长度。比如你写一个 ABCD 4个数,一共 4*4 = 16 字节。那么实际写入的是:
16 A B C D 16
作者: 1035326373    时间: 2014-12-17 17:01
fcode 发表于 2014-12-17 16:56
顺序方式写入的文件里,每个记录前后会多 4 字节,表示该记录的长度。比如你写一个 ABCD 4个数,一共 4*4 = ...

在不知道一个文件是以顺序方式写入还是直接写入时,该文件该怎么读取?或者怎么判读文件是以什么方式写入的?
作者: fcode    时间: 2014-12-17 18:54
猜呗。读一个数出来,比如读出来 16,然后数16字节,再读一个数,如果还是16,就可以基本判断这是一个顺序方式写入的。
如果每一个记录前后都有一个恰好是记录长度的数,那就可以完全判断是顺序方式写入的。

至于这种猜是你自己进行,还是写代码进行,那就是你的选择了。
作者: 1035326373    时间: 2015-1-29 22:47
fcode 发表于 2014-12-17 18:54
猜呗。读一个数出来,比如读出来 16,然后数16字节,再读一个数,如果还是16,就可以基本判断这是一个顺序 ...

在读取二进制文件过程中,由于文件是以顺序方式写入的。此时,有什么办法高效的读取任意记录吗?,在这个过程中需要大量读取数据。如果用do i=1,N read(12) end do的方式来定位,会不会浪费时间?
作者: fcode    时间: 2015-1-30 08:30
顺序方式写入,那么顺序方式读取。就比较好了。

如果你不想这样,那么可以考虑用直接读取方式。比如100个数据

[Fortran] 纯文本查看 复制代码
Type T_S
  Integer :: n_begin
  Real :: 单个数据
  Integer :: n_end
End Type
Type ( T_S) :: d(100)

Open( 12 , File = 文件名 , access='direct' , form='unformatted' , recl = 100 * ( 4 + 数据大小 + 4 ) )
Read( 12 , rec =  ) d(:)
Close(12)


这样就可以不用循环了。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2