2009-07-14 14 views
9

Scusami se questa è una domanda duplicata, ma non ho visto nulla di esattamente simile a questo.FORTRAN READ()

Cosa fa READ() in FORTRAN?

Ad esempio:

READ(1,82) 
+3

non sono sicuro che "FORTRAN" e "principiante" dovrebbe mai essere combinati. – stevedbrown

risposta

14

1 è l'handle di file, che è necessario aprire con il corretto invito aperto. 82 è un'etichetta che fa riferimento a un formato, ovvero a come verranno riportati i dati in termini di formattazione visiva.

 program foo 
     implicit none 
     integer :: i 
     double precision :: a 

     write (*,*) 'give me an integer and a float' 
     read (*,82) i,a 
     write (*,82) i,a 
82  format (I4, F8.3) 
     end program 

In questo esempio, il programma accetta dall'input standard (il cui numero unità non è specificato, e quindi messo a *) un intero e un valore in virgola mobile. il formato dice che il numero intero occupa le prime quattro colonne, quindi ho un float che rimane in 8 colonne, con 3 cifre dopo il punto decimale

Se eseguo il programma ora, e non seguo esattamente questo formato , il programma si lamenterà e si bloccherà, poiché le prime 4 colonne dovrebbero rappresentare un numero intero (a causa del formato I4) e "5 3." non è un numero intero valido

$ ./a.out 
give me an integer and a float 
5 3.5 
At line 7 of file test.f (Unit 5) 
Traceback: not available, compile with -ftrace=frame or -ftrace=full 
Fortran runtime error: Bad value during integer read 

Tuttavia, una specifica corretta (si prega di notare i tre spazi prima il numero 5) si esibirà il corretto funzionamento (con un po 'di tolleranza, non è che rigorosa)

$ ./a.out 
give me an integer and a float 
    5 3.5 
    5 3.500 
$ 
+0

Grazie amico! Stavo cercando esattamente questa spiegazione. – SRG

6

Si legge da "unità" (file aperto) numero 1, in base all'istruzione FORMAT sull'etichetta 82. Tuttavia, poiché l'istruzione non elenca alcuna variabile, non ha spazio per mettere i dati che sta leggendo, il che è improbabile che Aiuto; READ(1,82) FOOBAR sarebbe più utile inserire i dati che sta leggendo nella variabile FOOBAR.

+1

IIRC, il file numero 5 era l'equivalente di stdin e il numero 6 era l'equivalente di stdout. Il file 1 è probabilmente un file nel file system. Mi sembra di ricordare che i numeri erano pensati per mappare su unità nastro, ma era molto, molto tempo fa. –

+0

@David, heh sì, mi riporta alla mia giovinezza! -) –

+0

@David, @Alex, questo è stato il primo linguaggio di programmazione che ho imparato! 5 e 6 erano effettivamente gli input e output standard, ma dovevi impostare altri numeri dalla riga di comando. E potresti impostarli su qualsiasi cosa: disco, unità nastro, puncher virtuale, ecc. – azheglov

0

si legge dall'unità 1 utilizzando il formato specificato dal comunicato numerato 82.

+0

e come si aggiunge la tua risposta a questa discussione? – SilentGhost

3

si può fare un paio di cose con l'FORTRAN "leggere" dichiarazione.

considerare: lettura (unità #, formato, opzioni) ... generico

read (7,*,end=10) 

Dove, "7" è il numero di unità leggere da "*" è il formato (di default in questo caso) e "10" è il numero di linea a cui il controllo del programma salta quando il dispositivo/file di lettura raggiunge l'eof. Lo slot "opzioni" può essere riempito con elementi come "err =" numero di riga per andare a "", o iostat, advance = "no". È possibile controllare some more of these

La parte di formato è dove è possibile specificare più precisamente il formato dei dati che si prevede. Per esempio, se si dispone di un identificatore di formato come:

read (25,"(2X, 2I5, F7.3, A)") 

Qui, il "2X", si riferisce a 2 posti, la "2i5", si riferisce a 2 numeri interi che sono 5 cifre, "F7.3", si riferisce a un valore decimale che ha una lunghezza totale di 7, con tre cifre dopo il decimale. La "A" si riferisce a un personaggio. Puoi dare un'occhiata ad un altro di these

CHEERS!

0

Quando Fortran legge da un file, richiedeva che le istruzioni READ identifichino univocamente il file. L'identificazione viene eseguita utilizzando l'identificatore dell'unità Fortran.

Un identificatore unità può essere uno dei seguenti:

1) Una variabile intera o un'espressione il cui valore è maggiore o uguale a 0.

2) L'asterisco (*) è consentito solo su LEGGI e SCRIVI le dichiarazioni. Sulle istruzioni READ, un asterisco si riferisce all'unità 100 (input standard).

numeri di modulo sono meglio forniti utilizzando newunit

open(newunit=i,file='test') 

Utilizzare l'istruzione INQUIRE per verificare la validità (esistenza) di qualsiasi numero di unità prima di usarlo, come nel seguente esempio:

logical :: idok, fop 
inquire (unit=i, exist=idok, opened=fop) 
if (idok .and. .not. fop) then 
    open (unit = i, ...) 
endif 

Poi abbiamo l'istruzione FORMAT, un'istruzione etichettata che può apparire in qualsiasi parte del programma in cui il formato è visibile.

È di forma

READ(*,100) I, J, K 

Il FORMAT dichiarazione

100 FORMAT(I10,I10,I10) 

Una dichiarazione formato leggermente diverso è

100 FORMAT(3I10.8) 

che cede ancora una volta tre interi allineati a destra di larghezza 10 ma questa volta richiede un minimo di 8 cifre da stampare.

+2

Alcuni errori: l'identificativo dell'unità può essere negativo (ma non -1) e lo sarà se si riferisce a una connessione effettuata con l'identificatore 'newunit'; '*' non significa 100; 100--102 sono probabilmente ammessi; le unità 0, 5 e 6 non sono certamente associate a nulla; mentre un'istruzione 'format' può apparire ovunque, deve trovarsi nello stesso ambito inclusivo delle istruzioni di trasferimento dei dati a cui fa riferimento. – francescalus

+0

Aggiornare il post – Zeus

+0

Ho un codice in cui si usa '6' per l'output dello schermo. Quali sono esattamente i dettagli? – Zeus

1

"1" l'unità utilizzata per aprire un file in fortran e "82" specifica il formato per il comando di lettura.

open(1,file=fname,status='unknown') 
read(1,82) var_name 
82 format(2I5) 

Il codice di cui sopra si apre un file chiamato "fname" il comando di lettura legge dal file fname come è stato aperto con un il comando di lettura dell'unità "1" e legge nel formato come specificato dal formato 82. Dettagli sulla formattazione in FORTRAN è il seguente:

nim (Integer Specification) 
nfm.d (Floating point Specification) 
nEm.d(Exponential Specification) 
nAm (string specification) 

where 
"m" is the number of character spaces reserved for printing. (should be more than what you are reading otherwise read statement would not give correct results) 
"n" is the number of integers, floating point, characters or exponential numbers that you want to read. 
"d" are the number of decimal places up to which you want to read.