Стандартные устройства ввода и вывода в Fortran 90?
Как я могу читать и записывать стандартные потоки ввода, вывода и ошибок stdin
, stdout
и stderr
в Fortran? Я слышал, что запись в stderr
, например, была write(5, fmt=...)
, с 5
единицей для stderr
, и я знаю, что способ писать в stdout
- это использовать write(*, fmt=...)
.
Как читать и записывать стандартные устройства ввода и вывода с помощью компилятора ifort
?
Версия компилятора:
Компилятор Fortran Intel (R) для приложений, работающих на Intel (R) 64, версия 10.0 Build 20070426 Идентификатор пакета: l_fc_p_10.0.023 Copyright (C) 1985-2007 Intel Corporation. Все права защищены.
Ответы
Ответ 1
Если у вас есть компилятор 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
- это правильный способ портативной записи на эти устройства.
Ответ 2
В стандарте Fortran не указывается, какие номера единиц соответствуют stdin/out/err. Обычное соглашение, за которым следует, например, gfortran, это stderr = 0, stdin = 5, stdout = 6.
Если ваш компилятор поддерживает встроенный модуль F2003 ISO_FORTRAN_ENV, этот модуль содержит константы INPUT_UNIT, OUTPUT_UNIT и ERROR_UNIT, позволяющие программисту извлекать номера устройств для предварительно подключенных блоков.
Ответ 3
Это фактически 0 для stderr. 5 - stdin, 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.
Ответ 4
Стандартный способ записи в stdout
в Fortran - это поставить звездочку вместо номера единицы, т.е.
WRITE(*,fmt) something
или просто использовать
PRINT fmt,something
Аналогично, стандартный способ чтения из stdin
-
READ(*,fmt) something
Нет стандартного способа записи в stderr
, если вы не используете ERROR_UNIT
из модуля ISO_FORTRAN_ENV
, для которого требуется Fortran 2003 или более поздняя версия.
Номера единиц 0, 5 и 6, безусловно, будут работать в компиляторе ifort
(а также в некоторых других компиляторах Fortran), но имейте в виду, что они зависят от компилятора.