Standardowe jednostki wejścia i wyjścia w Fortran 90?

Jak mogę odczytywać i zapisywać standardowe strumienie wejścia, wyjścia i błędówstdin, stdout i stderr w Fortran? Słyszałem, że pisanie do stderr, na przykład, używane jako write(5, fmt=...), z 5 jednostką dla stderr, i Wiem, że sposób pisania do stdout to użycie write(*, fmt=...).

Jak odczytywać i zapisywać standardowe jednostki wejścia i wyjścia za pomocą kompilatora ifort?

Wersja kompilatora:

Intel (r) kompilator Fortran dla aplikacji działających na Intel(r) 64, Wersja 10.0 Build 20070426 ID pakietu: l_fc_p_10. 0. 023 Copyright (C) 1985-2007 Intel Corporation. Wszelkie prawa zastrzeżone

Author: Pureferret, 2011-12-14

4 answers

Jeśli masz kompilator Fortran 2003, Moduł wewnętrznyiso_fortran_env definiuje zmienne input_unit, output_unit i error_unit, które wskazują odpowiednio na standardowe wejście, standardowe wyjście i standardowy błąd.

Zazwyczaj używam czegoś takiego

#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 my input / output rutyny. Chociaż oznacza to oczywiście wstępne przetwarzanie Twojego pliku źródłowego (aby to zrobić z ifort, użyj znacznika -fpp podczas kompilacji kodu źródłowego lub zmień rozszerzenie pliku źródłowego z .f na .F lub od .f90 do .F90).

Alternatywą dla tego byłoby napisanie własnego, niezintegrowanego modułu iso_fortran_env (jeśli nie masz kompilatora Fortran 2003) , jak omówiono tutaj (ten link nie działa od momentu zamieszczenia tej odpowiedzi). W tym przykładzie używają modułu:

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

Jak zaznaczono w innych odpowiedziach, 0, 5 i 6 to Zwykle stderr, stdin i stdout (to prawda dla ifort na Linuksie), ale to jest Nie zdefiniowane przez standard Fortran. Użycie modułu iso_fortran_env jest prawidłowym sposobem przenoszenia zapisu do tych jednostek.

 36
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-26 09:40:10

Standard Fortran nie określa, które numery jednostek odpowiadają standardowi stdin/out / err. Standardową konwencją, po której następuje np. gfortran, jest to, że stderr=0, stdin=5, stdout=6.

Jeśli twój kompilator obsługuje wewnętrzny moduł Iso_fortran_env F2003, moduł ten zawiera stałe INPUT_UNIT, OUTPUT_UNIT i ERROR_UNIT, umożliwiając programiście przenośne pobieranie numerów jednostek dla wstępnie połączonych jednostek.

 12
Author: janneb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-14 17:19:15

To właściwie 0 dla stderr. 5 to stdin, 6 to stdout.

Na przykład:

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

Daje:

./a.out 
Error
Good

While

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

Zapisałbym parametr, który jest STDERR = 0, aby uczynić go przenośnym, więc jeśli trafisz na inną platformę, możesz po prostu zmienić parametr.

Ten przykład został skompilowany i uruchomiony z ifort 12.1.1.256, 11.1.069, 11.1.072 i 11.1.073.

 6
Author: tpg2114,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-23 08:53:05

Standardowym sposobem zapisu do stdout w Fortranie jest umieszczenie gwiazdki zamiast numeru jednostki, tzn.

WRITE(*,fmt) something

Lub po prostu użyć

PRINT fmt,something

Podobnie standardowy sposób odczytu z stdin to

READ(*,fmt) something

Nie ma standardowego sposobu zapisu do stderr, chyba że użyjesz ERROR_UNIT z modułu ISO_FORTRAN_ENV, który wymaga Fortran 2003 lub nowszego.

Liczby jednostek 0, 5 i 6 z pewnością sprawdzą się w kompilatorze ifort (a także w niektórych innych kompilatorach Fortrana), ale należy pamiętać są zależne od kompilatora.

 0
Author: Petr Pařík,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-06 20:39:58