2012-07-19 64 views
5

我有一個我想用Fortran閱讀的二進制文件。問題在於它不是由Fortran編寫的,所以它沒有記錄長度指示器。所以通常無格式的Fortran讀取將不起作用。Fortran可以直接從二進制文件中讀取字節嗎?

我有一個想法,我可以偷偷摸摸地讀取文件作爲格式文件,逐字節(或4字節乘4字節,真的)到字符數組,然後將字符的內容轉換爲整數和浮點數通過傳遞函數或可怕的等價語句。但是這不起作用:我嘗試一次讀取4個字節,根據inquire語句的POS輸出,讀取跳過像6000個字節左右,並且字符數組被加載垃圾。

所以這是一個不行。這個方法中有一些細節我忘記了嗎?或者在Fortran中有這樣一個完全不同且更好的方法嗎? (順便說一句,我也嘗試讀入integer*1數組和字節數組,儘管這些代碼會被編譯,但在讀取語句時,代碼崩潰了。)

回答

8

是的。

的Fortran 2003年推出的流訪問到的語言。在此之前,大多數處理器都支持相當於擴展的東西,可能稱爲「二進制」或類似的東西。

未格式化的流訪問強加文件中沒有記錄的結構。作爲一個例子,對從對應於在同伴C處理器單個int的文件(如果有的話)用於特定的Fortran處理器讀取的數據的:

USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT 
INTEGER, PARAMETER :: unit = 10 
CHARACTER(*), PARAMETER :: filename = 'name of your file' 
INTEGER(C_INT) :: data 
!*** 
OPEN(unit, filename, ACCESS='STREAM', FORM='UNFORMATTED') 
READ (unit) data 
CLOSE(unit) 
PRINT "('data was ',I0)", data 

您可能仍然具有字節序和數據類型的大小的問題,但這些方面是獨立於語言的。

如果你是2003年之前的Fortran然後格式化直接訪問閱讀到合適的整數變量可能工作寫入語言標準 - 這是Fortran的處理器具體,但適用於許多當前的處理器。

+0

太棒了!謝謝!而且我認爲我只是想用FORTRAN 90取得好成績。現在要學習更多!呃,好吧。非常感謝。 – 2012-07-19 23:02:37

+1

如果沒有「流」訪問,Fortran讀取將某些數據解釋爲記錄長度信息。它們都跳過了您想要讀取的數據,並導致記錄長度錯誤。此外,該文件在Fortran中並沒有真正的記錄。 – 2012-07-20 01:43:39

+0

@ M.S.B .:如果如OP所示,他首先嚐試格式化閱讀,我的猜測是它向前掃描,直到它遇到換行符。 – janneb 2012-07-20 04:45:23