Прочитать из конца файла в Fortran 90 - PullRequest
0 голосов
/ 25 декабря 2018

У меня вопрос, как читать, начиная с конца текстового файла.Например,

do
  read(1,*) i
  print *,i
end do

будет читать каждую строку в файле 1 и печатать содержимое на терминал.Как бы я сделал это, начиная с конца файла?

Ответы [ 2 ]

0 голосов
/ 25 декабря 2018

Вы можете достичь желаемого, используя inquire, access=stream и тег pos в операторе чтения.Краткое 10-минутное упражнение дает следующее:

program foo
   implicit none
   integer fd, i, j, m, n
   character, allocatable :: s(:)
   character :: c
   open(newunit=fd,file='foo.f90',access='stream',status='old', &
   position='append')
   inquire(fd, pos=n)
   allocate(s(n))
   m = 1
   do i = n-1, 1, -1
      read(fd, pos=i) c
      s(m:m) = c
      if (iachar(c) == 10) then
         do j = m, 1, -1
            write(*,'(A1)',advance='no') s(j)
         end do
         m = 1
      else
         m = m + 1
      end if
   end do
   write(*,*)
   do j = m-1, 1, -1
      write(*,'(A1)',advance='no') s(j)
   end do
   write(*,*)
   close(fd)
end program foo

Сохраните это в файл с именем foo.f90, скомпилируйте и запустите.Кто-то здесь может сделать его более элегантным.Отредактированная оригинальная версия: не нужно использовать секции массива для s(j).

0 голосов
/ 25 декабря 2018

Это невозможно.Чтение всегда начинается с определенной точки и продолжается вперед.По умолчанию он начинается с первого байта;но вы можете перейти в другое место.

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

Лучшим способом было бы прочитать весь файл один раз, помня, где были новые строки;затем итерируйте этот массив в обратном направлении, переходя к начальной позиции каждой строки, чтобы прочитать его.Это не так неэффективно, но и не очень хорошо.

Лучший способ, если у вас есть память для него, это прочитать весь файл в массив строк, а затем перевернуть массив в-Память.

...