grads,fortran,ncl二进制文件

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

猜你喜欢

转载自www.cnblogs.com/jiangleads/p/9022051.html