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
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.
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.
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.
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.
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