Подтвердить что ты не робот

Стандартные устройства ввода и вывода в 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. Все права защищены.

4b9b3361

Ответ 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), но имейте в виду, что они зависят от компилятора.