2011-12-14 12 views
19

Come posso leggere e scrivere sullo standard input, output e flussi di errori stdin, stdout e stderr in Fortran? Ho sentito scrittura stderr, per esempio, usato essere write(5, fmt=...), con 5 l'unità per stderr, e so che il modo di scrivere a stdout è quello di utilizzare write(*, fmt=...).Unità standard di input e output in Fortran 90?

Come si legge e scrive sulle unità di input e output standard con il compilatore ifort?

versione del compilatore:

Intel (R) Fortran Compiler per le applicazioni in esecuzione su processori Intel (R) 64, versione 10.0 Build 20.070.426 ID pacchetto: Copyright l_fc_p_10.0.023 (C) 1985-2007 Intel Corporation. Tutti i diritti riservati

+0

Quale versione di ifort? Hanno il supporto F2003 almeno per le versioni 11.1 in poi. – tpg2114

risposta

33

Se si dispone di un compilatore Fortran 2003, il modulo di intrinseca iso_fortran_env definisce le variabili input_unit, output_unit e error_unit che puntano a standard, errore standard fuori e di serie, rispettivamente.

tendo a usare qualcosa come

#ifdef f2003 
use, intrinsic :: iso_fortran_env, only : stdin=>input_unit, & 
              stdout=>output_unit, & 
              stderr=>error_unit 
#else 
#define stdin 5 
#define stdout 6 
#define stderr 0 
#endif 

nella mia routine di input/output. Anche se questo naturalmente significa preprocessing il file di origine (per fare questo con ifort, utilizzare il flag -fpp quando si compila il codice sorgente o modificare l'estensione del file di origine .f-.F o .f90-.F90).

Un'alternativa a questo sarebbe quella di scrivere il proprio, non intrinseca, iso_fortran_env modulo (se non si dispone di un compilatore Fortran 2003) , come discusso here (questo link è morto da quando questa risposta è stata pubblicata) . In questo esempio si usa un modulo:

module iso_fortran_env 

    ! Nonintrinsic version for Lahey/Fujitsu Fortran for Linux. 
    ! See Subclause 13.8.2 of the Fortran 2003 standard. 

    implicit NONE 
    public 

    integer, parameter :: Character_Storage_Size = 8 
    integer, parameter :: Error_Unit = 0 
    integer, parameter :: File_Storage_Size = 8 
    integer, parameter :: Input_Unit = 5 
    integer, parameter :: IOSTAT_END = -1 
    integer, parameter :: IOSTAT_EOR = -2 
    integer, parameter :: Numeric_Storage_Size = 32 
    integer, parameter :: Output_Unit = 6 

end module iso_fortran_env 

Come osservato in altre risposte, 0, 5 e 6 sono solitostderr, stdin e stdout (questo è vero per ifort su Linux), ma questo non è definito dallo standard Fortran.L'uso del modulo iso_fortran_env è il modo corretto per scrivere in modo leggibile su queste unità.

+0

Purtroppo non ho un compilatore compatibile 2003; Sono a Fortran 90. – Pureferret

+0

@Pureferret Quindi puoi semplicemente usare uno dei metodi alternativi che suggerisco. Anche le versioni 'ifort' recenti supportano parti dello standard 2003 incluso' iso_fortran_env'. – Chris

+0

Ho provato questo e non ha funzionato, il compilatore ha detto che tutto nel tuo primo blocco era 'cattiva sintassi del preprocessore' (credo) Non ho ancora provato il tuo secondo blocco, ma se la soluzione di @ tpg2114 non funziona , Non sono sicuro del perché/come funzionerebbe la tua soluzione. – Pureferret

5

In realtà è 0 per stderr. 5 è stdin, 6 è stdout.

Ad esempio:

PROGRAM TEST 
    WRITE(0,*) "Error" 
    WRITE(6,*) "Good" 
END PROGRAM TEST 

Dà:

./a.out 
Error 
Good 

mentre

./a.out 2> /dev/null 
Good 

avrei memorizzare un parametro che è STDERR = 0 per renderlo portatile, in modo se si ha colpito una piattaforma diversa è possibile modificare il parametro.

Questo esempio è stato compilato ed eseguito con ifort 12.1.1.256, 11.1.069, 11.1.072 e 11.1.073.

+0

Ho provato questo e non funziona. – Pureferret

+0

Ho appena provato con 4 diverse versioni di ifort e funziona, e funziona anche con gfortran 4.6.0, 4.6.1 e 4.6.2. Puoi pubblicare quali errori ti dà? – tpg2114

+0

Non mi dà alcun errore usando 'write (0, *)' ma quando reindirizzamento stderr al file, non succede nulla. La versione è: Intel (R) Fortran Compiler per applicazioni eseguite su Intel (R) 64, Versione 10.0 Build 20070426 ID pacchetto: l_fc_p_10.0.023 Copyright (C) 1985-2007 Intel Corporation. Tutti i diritti riservati. – Pureferret

12

Lo standard Fortran non specifica quali unità numeri corrispondono a stdin/out/err. La solita convenzione, seguita ad es. gfortran, è che stderr = 0, stdin = 5, stdout = 6.

Se il compilatore supporta il modulo intrinseco ISO_FORTRAN_ENV F2003, quel modulo contiene le costanti INPUT_UNIT, OUTPUT_UNIT e ERROR_UNIT che consentono al programmatore di recuperare in modo portabile i numeri di unità per le unità preconnesse.

0

Il metodo standard per scrivere stdout in Fortran è mettere un asterisco invece del numero di unità, cioè,

WRITE(*,fmt) something 

oppure usa semplicemente

PRINT fmt,something 

Analogamente, il metodo standard per leggere da stdin è

READ(*,fmt) something 

non c'è standar d modo di scrivere su stderr a meno che non si usi ERROR_UNIT dal modulo ISO_FORTRAN_ENV, che richiede Fortran 2003 o versione successiva.

I numeri di unità 0, 5 e 6 funzioneranno sicuramente nel compilatore ifort (e anche in alcuni altri compilatori Fortran), ma tenere presente che dipendono dal compilatore.

Problemi correlati