Fortran Coder

查看: 15564|回复: 9
打印 上一主题 下一主题

[文件读写] fortran二进制文件读取

[复制链接]

12

帖子

5

主题

0

精华

入门

F 币
72 元
贡献
43 点
跳转到指定楼层
楼主
发表于 2014-10-14 21:53:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在处理数据过程中,由于数据量较大,数据一般以二进制形式保存。现已知数据十进制的形式。十进制的格式诸如:format (4h 0v ,a8, 1h*, 2a8, 1h*, i6),或者format (4h 5d ,a8 , 1p, 2e12.5/( 2e12.5, 5i6)).求详细方法。
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2014-10-15 08:07:37 | 只看该作者
我建议你先不要学习如何写代码,而是先学习一下二进制文件的基础。它是无数据格式的,这一点很重要。

推荐阅读 http://fcode.cn/guide-4-1.html

12

帖子

5

主题

0

精华

入门

F 币
72 元
贡献
43 点
板凳
 楼主| 发表于 2014-10-24 11:34:42 | 只看该作者
fcode 发表于 2014-10-15 08:07
我建议你先不要学习如何写代码,而是先学习一下二进制文件的基础。它是无数据格式的,这一点很重要。

推荐 ...

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

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

捕获.PNG

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2014-10-24 22:18:31 | 只看该作者
不要重复发帖。

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

12

帖子

5

主题

0

精华

入门

F 币
72 元
贡献
43 点
5#
 楼主| 发表于 2014-12-17 16:50:22 | 只看该作者
楚香饭 发表于 2014-10-24 22:18
不要重复发帖。

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

直接读取的第一个记录与顺序读取时第一个read读取的内容不一致,是不是顺序方式写入的文件不能直接读取?

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

6#
发表于 2014-12-17 16:56:04 | 只看该作者
顺序方式写入的文件里,每个记录前后会多 4 字节,表示该记录的长度。比如你写一个 ABCD 4个数,一共 4*4 = 16 字节。那么实际写入的是:
16 A B C D 16

12

帖子

5

主题

0

精华

入门

F 币
72 元
贡献
43 点
7#
 楼主| 发表于 2014-12-17 17:01:24 | 只看该作者
fcode 发表于 2014-12-17 16:56
顺序方式写入的文件里,每个记录前后会多 4 字节,表示该记录的长度。比如你写一个 ABCD 4个数,一共 4*4 = ...

在不知道一个文件是以顺序方式写入还是直接写入时,该文件该怎么读取?或者怎么判读文件是以什么方式写入的?

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

8#
发表于 2014-12-17 18:54:21 | 只看该作者
猜呗。读一个数出来,比如读出来 16,然后数16字节,再读一个数,如果还是16,就可以基本判断这是一个顺序方式写入的。
如果每一个记录前后都有一个恰好是记录长度的数,那就可以完全判断是顺序方式写入的。

至于这种猜是你自己进行,还是写代码进行,那就是你的选择了。

12

帖子

5

主题

0

精华

入门

F 币
72 元
贡献
43 点
9#
 楼主| 发表于 2015-1-29 22:47:55 | 只看该作者
fcode 发表于 2014-12-17 18:54
猜呗。读一个数出来,比如读出来 16,然后数16字节,再读一个数,如果还是16,就可以基本判断这是一个顺序 ...

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

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

10#
发表于 2015-1-30 08:30:00 | 只看该作者
顺序方式写入,那么顺序方式读取。就比较好了。

如果你不想这样,那么可以考虑用直接读取方式。比如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)


这样就可以不用循环了。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-24 02:04

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表