Есть ли простой способ чтения из файла и печати на стандартный вывод в FORTRAN? - PullRequest
1 голос
/ 19 апреля 2011

У меня есть файл данных, который я хочу напечатать на стандартный вывод.Можно ли это сделать в Фортране, не считывая данные в массивы, а затем печатая массивы?

Спасибо

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

Вы можете открыть файл для доступа к потоку и обрабатывать его по одному символу за раз в цикле, пока не будет достигнут конец файла.Я понятия не имею, насколько (не) эффективно это может быть для больших файлов данных, но это избавляет вас от необходимости определять символьную переменную с длиной, достаточно большой, чтобы содержать самую длинную строку, что требует обоснованного предположения.

program echostd
    use, intrinsic :: iso_fortran_env, only: iostat_end
    implicit none

    character(*), parameter :: file_name = 'data.txt'

    integer   :: lun, io_status
    character :: char

    open(newunit=lun, file=file_name, access='stream', status='old',  &
         action='read')

    print *, '--- Content of file: ' // file_name // ' ---'

    do
        read(lun, iostat=io_status) char
        if(io_status == iostat_end) exit
        if(io_status > 0) error stop '*** Error occurred while reading file. ***'
        write(*, '(a)', advance='no') char
    end do

    print *, '--- End of content of file: ' // file_name // ' ---'

    close(lun)
end program echostd

Я использовал две функции Fortran 2008, но обе легко можно сделать без, если ваш компилятор их еще не поддерживает.
Одна из них - спецификатор newunit=;если ваш компилятор не поддерживает это, вы, конечно, можете использовать предопределенный номер устройства.
Другой является оператор error stop;просто удалите часть error, если необходимо.

0 голосов
/ 19 апреля 2011

ОК, мне просто любопытно, где вы используете Фортран.

Вы можете просто прочитать его в символьную переменную внутри цикла. У Фортрана есть утверждение типа

read (7,*,end=10) name

где вы можете продолжить чтение, пока не достигнете EOF (и он переместится на строку 10 в EOF).

...