Стандартные устройства ввода и вывода в Fortran 90?
Как я могу читать и писать в стандартные потоки ввода, вывода и ошибок stdin
, stdout
а также stderr
в Фортране? Я слышал, что писал stderr
например, раньше write(5, fmt=...)
, с 5
блок для stderr
и я знаю, как написать stdout
это использовать write(*, fmt=...)
,
Как мне читать и записывать в стандартные устройства ввода и вывода с ifort
компилятор?
Версия компилятора:
Intel (R) Fortran Compiler для приложений, работающих на Intel(R) 64, Версия 10.0 Build 20070426 Идентификатор пакета: l_fc_p_10.0.023 Copyright (C) 1985-2007 Intel Corporation. Все права защищены
4 ответа
Если у вас есть компилятор 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), но это не определяется стандартом Fortran. С использованием iso_fortran_env
Модуль - это правильный способ переноса данных в эти модули.
Стандарт Фортрана не определяет, какие номера единиц соответствуют стандартному стандартному входу / выходу / ошибке. Обычное соглашение, за которым следует, например, gfortran, состоит в том, что stderr=0, stdin=5, stdout=6.
Если ваш компилятор поддерживает встроенный модуль F2003 ISO_FORTRAN_ENV, этот модуль содержит константы INPUT_UNIT, OUTPUT_UNIT и ERROR_UNIT, позволяющие программисту переносить номера модулей для предварительно подключенных модулей.
Это на самом деле 0 для stderr. 5 - стандартный, 6 - стандартный.
Например:
PROGRAM TEST
WRITE(0,*) "Error"
WRITE(6,*) "Good"
END PROGRAM TEST
дает:
./a.out
Error
Good
в то время как
./a.out 2> /dev/null
Good
Я бы сохранил ПАРАМЕТР с STDERR = 0, чтобы сделать его переносимым, поэтому, если вы попали на платформу, которая отличается от других, вы можете просто изменить параметр.
Этот пример был скомпилирован и запущен с ifort 12.1.1.256, 11.1.069, 11.1.072 и 11.1.073.
Стандартный способ написать stdout
в Фортране стоит поставить звездочку вместо номера единицы, т.е.
WRITE(*,fmt) something
или просто использовать
PRINT fmt,something
Точно так же стандартный способ чтения из stdin
является
READ(*,fmt) something
Там нет стандартного способа написать stderr
если вы не используете ERROR_UNIT
от ISO_FORTRAN_ENV
модуль, который требует Fortran 2003 или более поздней версии.
Устройства с номерами 0, 5 и 6, безусловно, будут работать в ifort
компилятор (а также в некоторых других компиляторах Фортрана), но имейте в виду, что они зависят от компилятора.