Написать в существующий файл без перезаписи в Фортран
У меня есть существующий файл, написанный программой на Фортране (отформатированный), и я хотел бы добавить несколько строк в начале файла. Идея состоит в том, чтобы сделать это без создания копии исходного файла.
Я мог бы добавить строку в конец файла с помощью:
open(21,file=myfile.dat,status='old',action='write',
form='formatted',position="append")
write(21,*) "a new line"
но когда я попробовал:
open(21,file=myfile.dat,status='old',action='write',
form='formatted',position="rewind")
write(21,*) "a new line"
он перезаписывает весь файл.
Это может быть невозможно. По крайней мере, я был бы рад получить подтверждение, что это фактически невозможно.
3 ответа
Да, это невозможно. С position=
Вы только устанавливаете позицию для письма. Обычно вы просто удаляете все, что находится за пределами текущей записи, путем записи в последовательный файл. Вы можете настроить запись в начале в файле прямого доступа, но не просто добавить что-либо в начале. Вы должны сделать копию в первую очередь.
Если вы используете неформатированные данные и знаете, сколько строк ожидать, попробуйте использовать метод чтения / записи файла прямого доступа. Это может хранить информацию для каждой строки в "записи", к которой можно получить доступ позже, как в массиве.
Чтобы добавить в начало, просто создайте столько пустых записей, сколько у вас будет строк в заголовке в начале файла, затем вернитесь назад и измените их значения на фактические строки, которые вы хотите, чтобы они были позже.
Пример файла прямого доступа io:
CHARACTER (20) NAME
INTEGER I
INQUIRE (IOLENGTH = LEN) NAME
OPEN( 1, FILE = 'LIST', STATUS = 'REPLACE', ACCESS = 'DIRECT', &
RECL = LEN )
DO I = 1, 6
READ*, NAME
WRITE (1, REC = I) NAME ! write to the file
END DO
DO I = 1, 6
READ( 1, REC = I ) NAME ! read them back
PRINT*, NAME
END DO
WRITE (1, REC = 3) 'JOKER' ! change the third record
DO I = 1, 6
READ( 1, REC = I ) NAME ! read them back again
PRINT*, NAME
END DO
CLOSE (1)
END
исходный код, см. раздел "Файлы прямого доступа": http://oregonstate.edu/instruct/ch590/lessons/lesson7.html
Это возможно!!! Вот пример программы, которая может выполнить задачу.
! Program to write after the end line of a an existing data file
! Written in fortran 90
! Packed with an example
program write_end
implicit none
integer :: length=0,i
! Uncomment the below loop to check example
! A file.dat is created for EXAMPLE defined to have some 10 number of lines
! 'file.dat may be the file under your concern'.
! open (unit = 100, file = 'file.dat')
! do i = 1,10
! write(100,'(i3,a)')i,'th line'
! end do
! close(100)
! The below loop calculates the number of lines in the file 'file.dat'.
open(unit = 110, file = 'file.dat' )
do
read(110,*,end=10)
length= length + 1
end do
10 close(110)
! The number of lines are stored in length and printed.
write(6,'(a,i3)')'number of lines= ', length
! Loop to reach the end of the file.
open (unit= 120,file = 'file.dat')
do i = 1,length
read(120,*)
end do
! Data is being written at the end of the file...
write(120,*)'Written in the last line,:)'
close(120)
end