2012-07-19 16 views
5

Mam plik binarny, który chciałbym przeczytać z Fortran. Problem polega na tym, że nie został napisany przez Fortran, więc nie ma wskaźników długości rekordów. Więc zwykły niesformatowany odczyt Fortran nie zadziała.Czy Fortran odczytuje bajty bezpośrednio z pliku binarnego?

Myślałem, że mogę być sprytny i odczytać plik jako plik sformatowany, bajt po bajcie (lub 4 bajty po 4 bajty, naprawdę) do tablicy znaków, a następnie przekonwertować zawartość znaków na liczby całkowite i zmiennoprzecinkowe za pośrednictwem funkcji transferu lub oświadczenia o równoważnej przerwie. Ale to nie działa: staram się czytać 4 bajty na raz i, zgodnie z wyjściem POS z instrukcji inquire, odczyt przeskakuje ponad 6000 bajtów, a tablica znaków zostaje załadowana śmieciami.

To nie da. Czy w tym podejściu jest jakiś szczegół, o którym zapominam? Czy jest to po prostu inny i lepszy sposób na zrobienie tego w Fortranie? (BTW, próbowałem również czytać w tablicyi tablicy bajtów. Mimo że te kody się skompilowałyby, gdy doszło do przeczytania, kod się zawiesił.)

Odpowiedz

8

Tak.

Fortran 2003 wprowadził dostęp do strumienia w języku. Wcześniej większość procesorów obsługiwała coś podobnego do rozszerzenia, być może nazywanego "binarnym" lub podobnym.

Niesformatowany dostęp do strumienia nie narzuca żadnej struktury zapisu w pliku. Jako przykład, aby odczytać dane z pliku, który odpowiada jednemu int w procesorze towarzysz C (jeśli istnieje) dla danego procesora 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 

może nadal mają problemy z kolejność bajtów i rozmiaru typu danych, ale te aspekty są niezależne od języka.

Jeśli piszesz do standardu językowego przed Fortran 2003, może działać niesformatowany odczyt bezpośredniego dostępu do odpowiedniej zmiennej liczbowej, który jest specyficzny dla procesora, ale działa dla wielu obecnych procesorów.

+0

Działa świetnie! Dzięki! Pomyślałem, że chodzi mi o to, by osiągnąć sukces w grze FORTRAN 90. A teraz więcej się uczyć! Ach tak. Wielkie dzięki. –

+1

Bez dostępu do "strumienia" odczyt Fortran interpretował niektóre dane jako informacje o długości zapisu. Które z nich pominęły dane, które chciałeś przeczytać, i spowodowały, że długość rekordów była błędna. Poza tym plik nie ma żadnych zapisów w sensie Fortrana. –

+0

@ M.S.B .: Jeśli, jak wskazywał OP, próbował on po raz pierwszy z odczytem sformatowanym, domyślam się, że przeskanował do przodu, aż trafi znak nowej linii. – janneb