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 形式存儲的,需要注意。
__________________________________________________
2020年6月18日更新
ncl 二進制讀寫函數
ncl讀寫二進制文件有如下函數:fbinrecread,fbinread,fbindirread
GrADS默認的二進制文件格式是純數據。
fbinrecwrite :是以reccord方式寫數據,是順序存取的。
fbindirwrite:是直接將數據寫到文件中。此種方式寫的文件與GrADS默認二進制文件格式相同。但注意,GrADS一般默認是little_endian的字節序,需要指定選項。比如
setfileoption("bin","WriteByteOrder","BigEndian")