Comment lire et écrire dans les flux d'entrées, de sorties et d'erreurs standard stdin
, stdout
et stderr
dans Fortran? J'ai entendu écrire à stderr
, par exemple, utilisé pour être write(5, fmt=...)
, avec 5
l'unité pour stderr
, et je sais que le moyen d'écrire dans stdout
consiste à utiliser write(*, fmt=...)
.
Comment lire et écrire sur les unités d'entrée et de sortie standard avec le compilateur ifort
?
Version du compilateur:
Intel (R) Fortran Compiler pour les applications exécutées sur Intel (R) 64, Version 10.0 Build 20070426 ID de package: l_fc_p_10.0.023 Droits d'auteur (C) 1985-2007 Intel Corporation. Tous les droits sont réservés
Si vous avez un compilateur Fortran 2003, le module intrinsèque iso_fortran_env
définit les variables input_unit
, output_unit
et error_unit
qui pointent respectivement vers l'entrée standard, l'entrée standard et l'erreur standard.
J'ai tendance à utiliser quelque chose comme
#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
dans mes routines d'entrée/sortie. Bien que cela signifie bien sûr que prétraitement votre fichier source (pour ce faire avec ifort
, utilisez l’indicateur -fpp
lors de la compilation de votre code source ou modifiez l’extension du fichier source de .f
à .F
ou de .f90
à .F90
).
Une alternative à ceci serait d’écrire votre propre module iso_fortran_env
non-intrinsèque (si vous n’avez pas de compilateur Fortran 2003), comme discuté ici (ce lien est mort depuis que cette réponse a été postée). Dans cet exemple, ils utilisent un module:
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
Comme indiqué dans d'autres réponses, 0, 5 et 6 sont généralementstderr
, stdin
et stdout
(ceci est vrai pour ifort
sur Linux) mais ceci est not défini par le standard Fortran. L'utilisation du module iso_fortran_env
est la méthode correcte pour écrire de manière portable sur ces unités.
La norme Fortran ne spécifie pas quels numéros d'unités correspondent à stdin/out/err. La convention habituelle suivie par ex. gfortran, est-ce que stderr = 0, stdin = 5, stdout = 6.
Si votre compilateur prend en charge le module intrinsèque F2003 ISO_FORTRAN_ENV, ce module contient les constantes INPUT_UNIT, OUTPUT_UNIT et ERROR_UNIT, permettant au programmeur de récupérer de manière portable les numéros d'unité des unités préconnectées.
C'est en fait 0 pour stderr. 5 est stdin, 6 est stdout.
Par exemple:
PROGRAM TEST
WRITE(0,*) "Error"
WRITE(6,*) "Good"
END PROGRAM TEST
Donne:
./a.out
Error
Good
tandis que
./a.out 2> /dev/null
Good
Je voudrais stocker un paramètre qui est STDERR = 0 pour le rendre portable, donc si vous frappez une plate-forme différente, vous pouvez simplement changer le paramètre.
Cet exemple a été compilé et exécuté avec ifort 12.1.1.256, 11.1.069, 11.1.072 et 11.1.073.
La méthode standard pour écrire dans stdout
dans Fortran consiste à mettre un astérisque à la place du numéro d'unité, c'est-à-dire
WRITE(*,fmt) something
ou simplement utiliser
PRINT fmt,something
De même, le moyen standard de lire à partir de stdin
est
READ(*,fmt) something
Il n’existe pas de méthode standard pour écrire dans stderr
sauf si vous utilisez ERROR_UNIT
à partir du module ISO_FORTRAN_ENV
, qui requiert Fortran 2003 ou une version ultérieure.
Les unités 0, 5 et 6 fonctionneront certainement dans le compilateur ifort
(ainsi que dans d'autres compilateurs Fortran), mais gardez à l'esprit qu'elles dépendent du compilateur.