grad用fwrite生成的二进制文件大小和ncl用fbinwrite生成的不一样,相差有8个字节,参考了以下网页,问题出在顺序存取和直接存取的差异。 以下是我的理解,欢迎指正:
- Fortran里面,二进制文件的存储方式有sequential(顺序存取)和direct(直接存取)两种。其中,"顺序存取"不需要每次存取的数据(也称"记录“)的长度一致,而是在每笔记录两端加上了记录该记录所占长度的标识符。而"直接存取"要求每一笔记录的长度相同。
- Fortran文件的存放方式
顺序文件存放方式:
[length 1][记录1][length 1] [length 2][记录2][length 2] …… [length n][记录n][length n]…每一笔记录的两端都有一个占四个字节位的整数(length),记录了该笔记录所占的长度(单位字节)。
直接文件存放方式:
[记录1] [记录2] …… [记录n] …每一笔记录的长度是固定(相同)的。打开文件时,需要指定RECL= ???字段,告诉编译器每一笔记录的长度。因为每笔记录的长度都一致(可以认为是有格式文件),还需要加上form="formatted"这一参数描述。
- GrADS 用fwrite命令写的二进制文件的存放方式
fwrite命令写的二进制文件(比如grd文件)的方式很特别。它是按顺序(从前到后写的方式)写数据。但是,与fortran顺序文件的存放方式不同,每个记录的两端没有长度指示符。所以需要有相应的数据描述文件(*.ctl)对数据的存放格式进行描述。需要注意的是,一些代码中form="binary”这个参数描述,不是标准的fortran语法,一些编译器(如gfortran)可能无法通过编译。
关于二进制文件读取,有一种流文件读取的方法很好。在open语句里面添加access='stream',读文件的时候根据form=???字段指定的文件格式(有格式/无格式),自动用该类文件的读取方式读取数据。详见http://fcode.cn/guide-86-1.html
- 用NCL读取二进制文件的数据
在读数据之前需要知道文件的存取方式,是直接存取还是顺序存取的。根据相应的存取方式使用对应的函数读取数据。
此外,二进制文件存放的字节序 还有大小端(Big_Endian和Little_Endian)的区别。一些数据(如wrfout)是用Big_Endian 形式存储的,需要注意。