web-dev-qa-db-fra.com

Unités d’entrée et de sortie standard en Fortran 90?

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

25
Pureferret

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.

37
Chris

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.

12
janneb

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. 

6
tpg2114

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.

0
Petr Pařík