2016-04-27 13 views
1

Ich versuche, etwas Fortran-Code zu verstehen. An einer Stelle gibt es Zeile, wo es eine binäre Datei liest, ohne eine Eingabeliste Angabe, nur die Datei selbst und ein Statement-Label für das Erreichen des Endes der Datei:Eine Binärdatei mit Fortran lesen - Wenn keine Eingangsliste angegeben wird, wie viele Bytes überspringt Fortran?

open (unit=unitname,file='name.ext',form='unformatted',status='old',iostat=ios) 
... 
read (myFile,end=902) 

ich die Datei mit einigem Python-Code lesen und Mit etwas Debugging habe ich festgestellt, dass der Fortran-Code mit diesem read Befehl genau 2484 Bytes (ja, ich habe gezählt!) überspringt. Ich weiß nicht, ob es dafür einen besonderen Grund gibt. Wenn ich mich nicht irre, würde ein read Befehl in Fortran einfach die ganze Zeile ohne irgendeine Eingangsliste lesen, aber da dies eine binäre Datei ist, frage ich mich, was dann passiert. Woher kommt diese 2484 magische Zahl? Was passiert, wenn Sie eine Binärdatei lesen, ohne eine Eingabeliste in Fortran anzugeben?

+1

Wie ist die Datei verbunden, dh, welche 'offene' Anweisung gibt es? Es ist mit ziemlicher Sicherheit eine unformatierte sequentielle Zugriffsdatei, und der Datensatz ist um diese Zahl herum lang. – francescalus

+0

Ja, tatsächlich ist es unformatiert: open (unit = Einheitenname, file = 'name.ext', form = 'unformatted', status = 'alt', iostat = ios) Folgen die Daten der Datensatznummer? – user3180077

+0

Die Datensatzlänge ist in die Datei eingebettet, siehe hier: http://stackoverflow.com/a/15071797/1004168 – agentp

Antwort

2

Für eine Datei, die für den sequentiellen Zugriff verbunden ist, wird die Position der Datei durch eine read-Anweisung ohne Eingabefelder um einen Datensatz erweitert.

Für formatierte Eingabe, wie Sie in der Frage notieren, würde ein solcher Lesevorgang eine Zeile überspringen: In einer Datei für diese ist ein Datensatz in der Regel eine Zeile.

Die gleiche Idee gilt für unformatierte Eingabe, von dem, was Sie eine Binärdatei nennen. Was hier mit einer Aufzeichnung gemeint ist, ist vielleicht etwas außerhalb des Rahmens dieser Antwort (und es gibt viele Nuancen um diese herum), aber das Entscheidende ist, dass es immer noch eine gut definierte Vorstellung von der Größe eines Datensatzes gibt.

Und die Aussage voll zu rechtfertigen, wird Ihre Datei in der Tat für unformatierte Übertragung verbunden (und ist mit dieser read Aussage kompatibel):

open (unit=unitname,file='name.ext',form='unformatted',status='old',iostat=ios) 

Ohne access= Spezifizierer im Gegenteil in diesen open der Modus sequentiellen .