Если у вас есть компилятор Fortran 2003, встроенный модуль iso_fortran_env
определяет переменные input_unit
, output_unit
и error_unit
, которые указывают на стандартный вход, стандартный выход и стандартную ошибку соответственно.
Я склонен использовать что-то вроде
#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
в моих процедурах ввода / вывода. Хотя это, конечно, означает предварительную обработку вашего исходного файла (чтобы сделать это с ifort
, используйте флаг -fpp
при компиляции исходного кода или измените расширение исходного файла с .f
на .F
или от .f90
до .F90
).
Альтернативой этому было бы написать собственный, не свойственный iso_fortran_env
модуль (если у вас нет компилятора Fortran 2003) , как обсуждалось здесь (эта ссылка умерла с момента публикации этого ответа). В этом примере они используют модуль:
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
Как отмечалось в других ответах, 0, 5 и 6 равны обычно stderr
, stdin
и stdout
(это верно для ifort
в Linux), но это не , определенный стандартом Фортрана. Использование модуля iso_fortran_env
является правильным способом переноса данных в эти устройства.