2013-01-02 10 views
6

Ho aperto un file per scrivere un numero. Devo scrivere il numero alla fine del file in modoCome andare alla fine del file?

come arrivare all'ultima riga per scrivere su di esso?

+0

D: Il FORTRAN l'implementazione ha "fseek()"? O puoi semplicemente APRIRE in modalità "APPEND"? – paulsm4

risposta

5

Si dovrebbe aprire il file con

open(..., position="append",...) 

In alternativa, si può chiedere per la dimensione del file

inquire(...,size=some_integer_variable,...) 

quindi se il file è un file di accesso diretto, è possibile utilizzare questo formato per calcolare il numero di record del record finale. In alternativa, se la modalità di accesso è "stream", è possibile utilizzare

write(..., pos=some_integer_variable) 

di scrivere a partire dalla fine del file.

0

Ho usato lo stesso trucco per anni e sarei interessato a un modo più elegante, ma posso proporvi il seguente metodo. Si noti che è sempre meno efficiente in quanto il file aumenta di numero di righe. Si noti inoltre che questa parte di codice potrebbe finire in un elegante modulo dedicato alla riproduzione con input/output.

aprire il file

open(11, file='monfichier') 

Calcola quante linee ci sono nel file

nbline = 0 ! should have been declared as an integer 
do while(.true.) 
    read(11,*,iostat=ios) ! ios should have been declared as an integer 
    if(ios > 0) then 
    stop 'problem somewhere' 
    else if(ios < 0) then ! end of file is reached 
    exit 
    else 
    nbline = nbline + 1 
    end if 
end do 
close(11) 

in questa fase, si ha il numero totale di linee memorizzate nel nbline variabile. Se si desidera stampare qualcosa alla linea ennesimo prima dell'ultima riga, quindi

open(11, file='monfichier') 
do i = 1, nbline - N ! see my nota bene at the end of my answer; i and N are integers 
    read(11,*) 
end do 
write(11,*)'hello world' 

Et voilà!

N.B. : Si prega di prestare attenzione nel modo in cui si conta per nbline-N o nbline- (N-1), a seconda esattamente di ciò che si desidera.

+0

Perché dovresti usare questo metodo quando 'position = 'append'' soddisfa i requisiti dell'OP? Questo ha qualche vantaggio rispetto all'approccio diretto? –

+0

@HighPerformanceMark - L'unica cosa che posso pensare è che questo può essere fatto per compilare con un compilatore f77 (antico) severo (con un piccolo aggiustamento - es. Rimuovi 'do while' a favore di etichette di istruzioni, goto e if [yikes!]) considerando che 'position = 'append'' non è stato aggiunto fino a più tardi (non sono sicuro esattamente quanto tempo dopo). – mgilson

+0

@mgilson in effetti ... Una domanda però: non è questo metodo più generico in quanto è possibile scrivere in qualsiasi luogo desiderato, ad es. alla penultima riga. Puoi farlo usando 'position ='? – max