Стандартные устройства ввода и вывода в 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 компилятор (а также в некоторых других компиляторах Фортрана), но имейте в виду, что они зависят от компилятора.

Другие вопросы по тегам