Стандартные устройства ввода и вывода в Fortran 90? - PullRequest
27 голосов
/ 14 декабря 2011

Как я могу читать и записывать в стандартные потоки ввода, вывода и ошибок stdin, stdout и stderr в Fortran?Я слышал запись в stderr, например, использовал , чтобы быть write(5, fmt=...), с 5 единицей для stderr, и я знаю способ записи в stdout, чтобыиспользовать write(*, fmt=...).

Как читать и записывать в стандартные блоки ввода и вывода с помощью компилятора ifort?

Версия компилятора:

Intel(R) Компилятор Fortran для приложений, работающих на Intel (R) 64, Версия 10.0 Build 20070426 Идентификатор пакета: l_fc_p_10.0.023 Copyright (C) 1985-2007 Intel Corporation.Все права защищены

Ответы [ 4 ]

39 голосов
/ 14 декабря 2011

Если у вас есть компилятор 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 является правильным способом переноса данных в эти устройства.

13 голосов
/ 14 декабря 2011

Стандарт Фортрана не определяет, какие номера единиц соответствуют стандартному стандартному входу / выходу / ошибке.Обычное соглашение, за которым следует, например, gfortran, состоит в том, что stderr = 0, stdin = 5, stdout = 6.

Если ваш компилятор поддерживает встроенный модуль F2003 ISO_FORTRAN_ENV, этот модуль содержит константы INPUT_UNIT, OUTPUT_UNIT и ERROR_UNITпозволяя программисту переносить номера единиц измерения для предварительно подключенных единиц.

8 голосов
/ 14 декабря 2011

Это на самом деле 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.

1 голос
/ 06 октября 2017

Стандартный способ записи в stdout в Фортране - это поставить звездочку вместо номера единицы, то есть

WRITE(*,fmt) something

или просто использовать

PRINT fmt,something

Аналогичностандартным способом чтения из stdin является

READ(*,fmt) something

Не существует стандартного способа записи в stderr, если только вы не используете ERROR_UNIT из модуля ISO_FORTRAN_ENV, для которого требуется Fortran 2003 или более поздняя версия.

Элементы 0, 5 и 6, безусловно, будут работать в компиляторе ifort (а также в некоторых других компиляторах Фортрана), но имейте в виду, что они зависят от компилятора.

...