Fortran Coder

查看: 10108|回复: 4
打印 上一主题 下一主题

[文件读写] 关于二进制文件读写的疑问?

[复制链接]

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

楼主
发表于 2020-3-31 14:20:33 | 显示全部楼层
你提到的文章,多看几遍。

1963

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1357 元
贡献
574 点

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

沙发
发表于 2020-4-1 09:20:52 | 显示全部楼层
如果你采用二进制文件,就应该放弃回车换行符的想法。(那是文本文件中的分隔符)
二进制文件通常不用分隔符,数据紧凑的在一起。程序员(或者数据格式的设计者),他们心中有数据的结构,心中知道数据的分割在什么位置就行了。

回到你的问题,如图中 10 00 00 00,这并不是“行起始和行结束的数值符号代码”,而是(顺序读取特有的)“本次记录的长度”,比如这里的 0x10000000,十进制就是16,说明本次记录的长度是16个字节。你可以把输出的内容的字节数加起来,就是16。
一般在直接读取中,不会用到本次记录的长度。因为直接读取,要求每次的记录长度是相等的。(只有每次相等,才可以根据记录数 rec 和记录长度 recl,直接计算出读取的位置,也就是 (rec-1)*recl + 1)

所以,直接读取需要在 Open 时指定 recl 也就是记录长度。指定后不能改变,除非close了重新open
而顺序读取,每次读写的记录长度不一样。为了让读取者知道本次记录有多长,就把记录长度写在本次记录的前面和后面。

除了直接读写和顺序读写,Fortran2003还增加了流文件读写,非常的灵活。反正我很久不用直接和顺序读取二进制了,自有了Fortran2003,我是凡二进制一律用流文件读写。
你可以阅读 http://stream.w.fcode.cn
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-5-3 05:42

Powered by Tencent X3.4

© 2013-2024 Tencent

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