it-swarm.com.de

Standard Ein- und Ausgabeeinheiten im Fortran 90?

Wie kann ich in Fortran die Standard-Eingabe-, Ausgabe- und Fehlerströme stdin, stdout und stderr lesen und beschreiben? Ich habe gehört, wie ich in stderr geschrieben habe, zum Beispiel used , um write(5, fmt=...) zu sein, mit 5, der Einheit für stderr, und ich weiß, wie man in stdout schreibt, indem man write(*, fmt=...) verwendet.

Wie kann ich mit dem Compiler ifort die Standard-Ein- und Ausgabeeinheiten lesen und beschreiben?

Compiler-Version:

Intel (R) Fortran Compiler für Anwendungen, die auf Intel (R) 64, Version 10.0 Build 20070426 ausgeführt werden. Paket-ID: l_fc_p_10.0.023 Copyright (C) 1985-2007 Intel Corporation. Alle Rechte vorbehalten

25
Pureferret

Wenn Sie einen Fortran 2003-Compiler haben, definiert das intrinsische Modul iso_fortran_env die Variablen input_unit, output_unit und error_unit, die auf Standard-Ein, Standard-Aus und Standardfehler zeigen.

Ich neige dazu, so etwas zu benutzen

#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

in meinen Ein-/Ausgaberoutinen. Obwohl dies natürlich Vorverarbeitung Ihre Quelldatei bedeutet (verwenden Sie dazu ifort das -fpp-Flag, wenn Sie Ihren Quellcode kompilieren oder ändern Sie die Quelldateierweiterung von .f in .F oder von .f90 in .F90).

Eine Alternative dazu wäre, ein eigenes, nicht intrinsisches iso_fortran_env-Modul zu schreiben (wenn Sie keinen Fortran 2003-Compiler haben)., wie besprochen hier (Dieser Link ist gestorben, seit diese Antwort veröffentlicht wurde). In diesem Beispiel verwenden sie ein Modul:

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

Wie in anderen Antworten angemerkt, sind 0, 5 und 6 normalerweisestderr, stdin und stdout (dies gilt für ifort unter Linux), aber dies ist not , das vom Fortran-Standard definiert wird. Die Verwendung des iso_fortran_env-Moduls ist der richtige Weg, portabel auf diese Einheiten zu schreiben.

37
Chris

Der Fortran-Standard gibt nicht an, welche Einheitennummern stdin/out/err entsprechen. Die übliche Konvention, gefolgt von z. gfortran ist, dass stderr = 0, stdin = 5, stdout = 6 ist.

Wenn Ihr Compiler das intrinsische F2003-Modul ISO_FORTRAN_ENV unterstützt, enthält dieses Modul die Konstanten INPUT_UNIT, OUTPUT_UNIT und ERROR_UNIT, sodass der Programmierer die Gerätenummern für die vorverbundenen Einheiten portabel abrufen kann.

12
janneb

Es ist eigentlich 0 für Stderr. 5 ist stdin, 6 ist stdout. 

Zum Beispiel:

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

Gibt:

./a.out 
Error
Good

während

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

Ich würde einen PARAMETER speichern, der STDERR = 0 ist, um ihn portabel zu machen. Wenn Sie also auf eine andere Plattform stoßen, können Sie einfach den Parameter ändern. 

Dieses Beispiel wurde kompiliert und mit ifort 12.1.1.256, 11.1.069, 11.1.072 und 11.1.073 ausgeführt. 

6
tpg2114

Die Standardmethode für das Schreiben in stdout in Fortran ist das Setzen eines Sterns anstelle der Einheitsnummer, d. H.

WRITE(*,fmt) something

oder einfach verwenden

PRINT fmt,something

In ähnlicher Weise lesen Sie stdin standardmäßig

READ(*,fmt) something

Es gibt keine Standardmethode zum Schreiben in stderr, es sei denn, Sie verwenden ERROR_UNIT aus dem ISO_FORTRAN_ENV-Modul, für das Fortran 2003 oder höher erforderlich ist.

Die Unit-Nummern 0, 5 und 6 funktionieren sicherlich im ifort-Compiler (und auch in einigen anderen Fortran-Compilern), bedenken Sie jedoch, dass sie compilerabhängig sind.

0
Petr Pařík