воскресенье, 10 апреля 2011 г.

Gfortran reading until EOF. EOF чтение до конца файла

Свободно распространяемый компилятор gfortran (http://ru.wikipedia.org/wiki/GFortran или http://www.gfortran.org/) имеет ряд "проблем" с функциями, которые спокойно работают в других компиляторах фортрана.
Одной из таких проблем является отсутствие возможности чтения до конца файла (EOF) в цикле условия (do while) в таком виде:

integer :: unit
real :: stud4

unit = 10

do while(.not. eof(unit)) ! Обработка данных файла
read(unit) stud4
***
end do

Как же заменить эту функцию в gfortran? Как один из вариантов - написать небольшую подпрограмму чтения файла до конца (до EOF), которая вычислит число строк в файле, и затем вернёт это целое значение n пользователю. Тогда вместо цикла "do while - enddo" ставим цикл "do i =1,n - enddo". Примером реализации такого алгоритма может служить такой вариант:

SUBROUTINE READ_EOF(n,nstrok)

INTEGER, INTENT(in) ::n ! Даётся явное описание входящих в подпрограмму параметров
INTEGER, INTENT(out) :: nstrok ! "-" исходящих из подпрограммы параметров

INTEGER :: nstrok_counter
CHARACTER(1) :: a

ioer=0
nstrok_counter=0
DO WHILE (ioer.eq. 0)
READ(n,*,iostat=ioer) a
nstrok_counter=nstrok_counter + 1
ENDDO
REWIND(n)
nstrok=nstrok_counter-1

RETURN

END

В подпрограмму передаётся номер канала n файла, который надо прочесть до конца (до EOF), и подпрограмма возвращает число строк, содержащихся в файле.

Комментариев нет:

Отправить комментарий

Как перевести UV в направление и скорость ветра? How to convert wind UV-components to direction and velocity?

 Всё просто.  def uv2dir(u, v):     '''     Источник:     https://github.com/blaylockbk/Ute_WRF/blob/master/functions/wind_calc...