Как записать данные в определенную строку в файле в Fotran? - PullRequest
1 голос
/ 18 августа 2011

У меня неупорядоченные данные, и я хочу записать эти данные в файл с заказом. Например, порядок значений 70-й, затем это значение записывается в 70-ю строку в файле. Как я могу переместить указатель файла вперед. Есть ли какая-нибудь команда типа BACKSPACE?

Ответы [ 3 ]

3 голосов
/ 18 августа 2011

Вы также можете использовать файл прямого доступа, в котором записи могут быть записаны и прочитаны не по порядку. См. Например, http://en.wikipedia.org/wiki/Fortran_95_language_features#Direct-access_files

Изменить через один день:

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

program test_rewind

   integer :: i, j


   open (unit=15, file="test_rewind.txt", access="sequential", form="formatted", action="readwrite" )

   do i=1,10
      write (15, '(I4)') i
   end do

   rewind (15)

   do i=1,4
      read (15, *) j
   end do

   write (15, '(I4)') 99

   stop

end program test_rewind

Выходной файл содержит:

   1
   2
   3
   4
  99

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

Сравните с решением прямого доступа:

program test_rewind

   integer :: i

   open (unit=15, file="test_rewind.dat", access="direct", form="unformatted", action="readwrite", recl=4 )

   do i=1,10
      write (15, rec=i) i
   end do

   write (15, rec=5) 99

   stop

end program test_rewind

Короче и работает - выходной файл содержит десять чисел с 5-м, измененным с 5 на 99. Однако они двоичные.

3 голосов
/ 18 августа 2011

Когда вы говорите о линиях и возврате, вероятно, вы имеете в виду access = "sequential" и form = "formatted".

В этом случае, чтобы пропустить запись вперед, вы можете просто выполнить пустое чтение, например,

read(unitnum, *)
1 голос
/ 19 августа 2011

Для каждого ввода данных используйте метод, описанный janneb, чтобы добраться до нужной строки. Затем используйте инструкцию REWIND, чтобы вернуться к началу файла (только access = 'sequential').

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

...