2013-10-25 26 views
8

Mam istniejący plik napisany przez program Fortran (sformatowany) i chciałbym dodać kilka wierszy na początku pliku. Chodzi o to, aby zrobić to bez tworzenia kopii oryginalnego pliku.Napisz istniejący plik bez nadpisywania w Fortranie

mogę dodać linię na końcu pliku z:

open(21,file=myfile.dat,status='old',action='write', 
     form='formatted',position="append") 
write(21,*) "a new line" 

ale kiedy próbowałem:

open(21,file=myfile.dat,status='old',action='write', 
     form='formatted',position="rewind") 
write(21,*) "a new line" 

nadpisuje cały plik.

To może być niemożliwe. Przynajmniej, byłbym zadowolony, gdyby otrzymałem potwierdzenie, że jest to faktycznie niemożliwe.

Odpowiedz

4

Tak, to niemożliwe. Przy position= ustawiasz tylko pozycję do zapisu. Zwykle usuwa się wszystko poza aktualnym rekordem przez zapisanie w pliku sekwencyjnym. Możesz być w stanie dostosować rekord na początku w pliku bezpośredniego dostępu, ale także nie tylko dodać coś na początku. Najpierw musisz zrobić kopię.

+0

Ale nie trzeba czytać całego starego pliku do pamięci w pewnego razu. Użyj systemu operacyjnego, aby zmienić nazwę starego pliku na plik tymczasowy. Następnie utwórz nowy plik, używając starej nazwy pliku i wprowadź żądane dane. Następnie dołącz stary plik do nowego pliku. (W zależności od systemu operacyjnego i rodzaju danych pliku, możesz to zrobić w systemie operacyjnym.) – dmm

+0

"najpierw wykonaj kopię" obejmuje również twoją sytuację. –

-1

Jest to możliwe !!! Oto przykładowy program, który może wykonać to zadanie.

! 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 
+0

Chce napisać na ** początku ** pliku. Do pisania na i po prostu użyj 'position = append'. –

+0

Dziękuję, nie przeczytałem poprawnie pytania. Nigdy więcej się nie powtórzę. Nie wiem, czy jakakolwiek różnica między position = append, Ale access = 'append', status = 'old' działa też – Sathyam

+0

'access = append' to dziwne niestandardowe rozszerzenie. Standardowy, Fortran 90 to 'position = append' –

0

Jeśli używasz danych ONZ sformatowany i wiedzieć, ile wierszy oczekiwać, spróbuj użyć bezpośredniego dostępu do plików odczytu/zapisu metoda. Ma to potencjał do przechowywania informacji dla każdej linii w "rekordzie", do którego można później uzyskać dostęp podobnie jak tablica.

Aby dołączyć do początku, po prostu stwórz tyle pustych rekordów, ile będziesz miał wierszy w "nagłówku" na początku pliku, a potem wróć i zmień ich wartości do rzeczywistych linii, które chcesz, aby były później.

Przykład bezpośredni dostęp do plików 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 

kod źródłowy, patrz rozdział „Bezpośredniego dostępu do plików”: http://oregonstate.edu/instruct/ch590/lessons/lesson7.html