2012-04-03 23 views
5

Ho lavorato con Fortran per anni, ma il file I/O è ancora confuso con me. La mia comprensione di status, form, access, recl è limitata, perché ho solo necessario alcuni casi di utilizzo in scuola elementare.
So che i file binari di Fortran hanno informazioni extra nella parte superiore del file che descrivono la dimensione del file. Ma questo non è mai stato un problema per me perché ho avuto a che fare solo con i file Fortran nel codice Fortran, dove le informazioni extra sono necessarie, ma invisibili.Apertura di file binari in Fortran: stato, modulo, accesso

Ma come posso aprire un file binario e piatto in Fortran?

In passato, potrei aprire un binario Fortran usando Fortran facendo qualcosa di simile a questo:

open(id,file=file_name,status='old', 
    +  form='unformatted',access='direct',recl=4,iostat=ok) 
     if (ok .ne. 0) then 
     write(1,20) id,ok,file_name 
       else 
     write(1,21) id,file_name 

Ma come funziona questo cambiamento per un file flat, binario che non ha le informazioni di intestazione Fortran ? Ancora più importante, dove è un buon collegamento per descrivere questi termini in modo più dettagliato: status, form, access, recl?

+0

Bene, quando dico binario "C++", intendo solo un file binario grezzo e piatto che è stato scritto da un programma C++. Il formato del file sarà ... qualunque cosa, un binario piatto pieno di righe e colonne di interi a 1 byte. Ovviamente, la mia principale preoccupazione è cercare di leggere un file binario in Fortran se il file non ha la solita intestazione Fortran. – theJollySin

+0

Quindi qualsiasi linguaggio creato è completamente irrilevante e distrae dal tuo problema reale. Modificato e rimosso il tag C++. – Mat

+0

Sembra giusto. L'ho inserito nel titolo e nel testo per sottolineare, si spera, che questi erano i soliti binari di Fortran che stavo cercando di leggere. Fintanto che è ancora chiaro, sono felice. – theJollySin

risposta

8

Odio fare questo, ma sento che se speravo di trovare risposte in questo post, la via da seguire non sarebbe chiara. Quindi ecco la strada da seguire.

La versione corta

in Fortran 77/90, per aprire un file standard Fortran binario si potrebbe scrivere:

OPEN (5, FILE="myFile.txt") 

Ma per aprire un file binario piatta, non si farebbe Fortran dovuto scrivere qualcosa di più simile a questo:

OPEN(5, file="myFile.txt", form='unformatted', access='direct', recl=1) 

questa differenza è perché i file binari Fortran-designati hanno un'intestazione di 4 byte e f ooter attorno a ciascun "record" nel file. Queste intestazioni/piè di pagina descrivono la dimensione dei dati contenuti nel record. (Nel caso più comune, ogni file binario che si incontra avrà solo un record.)

la versione lunga

Fortran assume un sacco di inadempienza open argomenti. In effetti, il nostro esempio originale può essere scritto nel seguente modulo dettagliato per mostrare tutti i valori predefiniti che sono stati assunti.

OPEN (5, FILE="myFile.txt") 
OPEN (5, FILE="myFile.txt", FORM="FORMATTED", 
    + ACCESS="SEQUENTIAL", STATUS="UNKNOWN") 

Guardiamo ogni argomento:

  • FORM definisce se un file è costituito da testo (form='formatted') o dati binari (form='unformatted').

  • ACCESSO definisce se si sta leggendo i dati dal file in ordine (access='sequential') o in qualsiasi ordine che si desidera (access='direct').

  • RECL definisce il numero di byte che va in ogni record. Ad esempio, recl=1 dice solo che le lunghezze dei record sono 1 byte ciascuna; forse sono interi a 1 byte.

  • STATUS definisce se il file esiste già. L'argomento STATUS="UNKNOWN" indica che il file potrebbe non esistere ancora, ma in caso contrario verrà creato. Se si desidera proteggere contro la possibilità di scrivere su un vecchio file, utilizzare: STATUS="OLD". Allo stesso modo, se sai che il file non esiste ancora, ti consigliamo di utilizzare: STATUS="NEW".

Per ulteriori informazioni:

Queste dichiarazioni aperti hanno anche un impatto sui lettura/scrittura/chiudi le dichiarazioni che seguiranno. Nel mio post originale, avevo bisogno di sapere che se si apre un file di accesso diretto è necessario scrivere su un file di accesso diretto. (Ovvero, non ci saranno intestazioni/piè di pagina Fortran inclusi nel file binario.) Tuttavia, la funzionalità predefinita di Fortran è quella di creare file di accesso sequenziali con intestazioni e piè di pagina Fortran inclusi.

Per ulteriori informazioni su open dichiarazioni in Fortran 77/90, ci sono buone risorse online:

A nice page da Lin Jinsen del vescovo University (grazie mille).

Slightly more official documentation di IBM per i suoi compilatori.

1

È possibile specificare open per utilizzare la nuova modalità di flusso IO in Fortran 2003 con access='stream'.

+0

Ah, sarebbe fantastico, sì. Ma sono bloccato usando Fortran 77. – theJollySin

+4

Come puoi essere bloccato con Fortran 77, non c'è più nessun compilatore in giro, che non può compilare F90? – haraldkl

+1

@haraldkl - Tuttavia, ci sono molti utenti ignoranti che si rifiutano di apprendere le versioni più recenti e insistono su F77, per quanto sciocco possa sembrare. Perché non Fortran IV, chiedo sempre? – Rook

5

Un avvertimento è la lunghezza del record data in recl default il numero di parole di 4 byte con i record non formattati (almeno su compilatori Intel, utilizzare byterecl per specificare in altro modo), quindi potrebbe essere necessario specificare un'opzione del compilatore o l'uso recl=1.

Poiché il codice è valido, utilizzando non formattato e diretto, tutto ciò che devi fare per assicurarti di leggere i dati correttamente è scegliere una lunghezza di registrazione appropriata. Ma alcuni compilatori FORTRAN non sempre funzionano bene con file binari non formattati e suggerirei di adottare lo HDF5 in futuro.

Se disponibile, il compilatore può consentire recordtype='stream':

open (id, file=file_name, status='old', form='unformatted' & 
     , access='stream', iostat=ios) 
! read (id, pos=1) someValue 
+0

Grazie per aver specificato che recl valori di default sono parole a 4 byte per i compilatori Intel. Non riuscivo a trovarlo menzionato nella documentazione Intel in modo strano. – umbersar

1

Se non è possibile utilizzare l'accesso torrente, è necessario utilizzare l'accesso diretto. Vedi i collegamenti in risposta a this question.