Fortran поддерживает три формы доступа к файлам - прямой, STREAM (F2003 +) и последовательна. Поддержка доступа DIRECT и STREAM позволяет переписывать предыдущие части файла, доступ SEQUENTIAL не выполняется (перезапись на более раннюю запись обрезает файл в перезаписываемой записи).
С прямым доступом все записи в файле имеют одинаковую длину. Любая запись может быть [должна быть доступна] любым оператором ввода/вывода, просто указав соответствующий номер записи в инструкции. Обратите внимание, однако, что типичный формат диска файла прямого доступа может не соответствовать вашей идее файла с «строками».
С форматированным доступом к потоку текущая позиция в файле может быть записана с использованием инструкции INQUIRE, а затем более поздний оператор ввода-вывода может начать передачу данных в этой позиции с помощью спецификатора POS. Типичный формат диска отформатированного файла доступа к потоку обычно совпадает с тем, что люди ожидают от текстового файла с линиями.
Поток доступа, скорее всего, того, что вы хотите. Примеры для обоих подходов показаны ниже.
Прямой доступ:
PROGRAM direct
IMPLICIT NONE
INTEGER :: unit
REAL :: r
INTEGER :: line
OPEN(NEWUNIT=unit, &
FILE='direct.txt', &
STATUS='REPLACE', &
ACCESS='DIRECT', &
RECL=15, & ! The fixed record length.
FORM='FORMATTED')
CALL RANDOM_SEED()
! No need to write records in order - we just leave off
! writing the first record until the end.
line = 0
DO
CALL RANDOM_NUMBER(r)
IF (r < 0.05) EXIT
line = line + 1
PRINT "('Writing line ',I0)", line
! All the "data" records are offset by one, to allow the
! first record to record the line count.
WRITE (unit, "('line ',I10)", REC=line+1) line
END DO
! Now update the first record with the number of following "lines".
WRITE (unit, "(I10)", REC=1) line
CLOSE(unit)
END PROGRAM direct
доступ Поток:
PROGRAM stream
IMPLICIT NONE
INTEGER :: unit
REAL :: r
INTEGER :: line
INTEGER :: pos
OPEN(NEWUNIT=unit, &
FILE='stream.txt', &
STATUS='REPLACE', &
ACCESS='STREAM', &
POSITION='REWIND', &
FORM='FORMATTED')
CALL RANDOM_SEED()
! Remember where we are. In this case, the position
! is the first file storage unit in the file, but
! it doesn't have to be.
INQUIRE(unit, POS=pos)
! Leave some space in the file for later overwriting
! with the number of lines. We'll stick the number
! zero in there for now.
WRITE (unit, "(I10)") 0
! Write out the varying number of lines.
line = 0
DO
CALL RANDOM_NUMBER(r)
IF (r < 0.05) EXIT
line = line + 1
PRINT "('Writing line ',I0)", line
WRITE (unit, "('line ',I10)") line
END DO
! Now update the space at the start with the number of following "lines".
WRITE (unit, "(I10)", POS=pos) line
CLOSE(unit)
END PROGRAM stream
Спасибо за подробный ответ и программы. Это был мой план резервного копирования. Вы сохранили мое время, чтобы написать код для перезаписи файла. :) –
Так я бы это сделал. Я не гарантирую, что нет лучшего, о котором я не знаю. – chw21