25.06.2013 Views

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

Il Linguaggio Fortran 90/95

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

432 Operazioni di I/O su file<br />

8.3.1 I/O non advancing<br />

Quando un’istruzione di I/O advancing viene eseguita, l’operazione di lettura o di scrittura<br />

comincia sempre dal record successivo a quello corrente e lascia il file posizionato alla fine del<br />

reord processato. Inoltre, nelle operazioni di ingresso, la lista di input non deve specificare più<br />

caratteri (o valori) di quanti stabiliti con la eventuale specificazione della lunghezza del record.<br />

Nel caso, invece, in cui, per file formattati, il numero di caratteri prodotti in input sono inferiori<br />

alla specificazione della lunghezza del record, la restante parte del record viene completata con<br />

spazi bianchi a meno che nella lista di OPEN non sia stato inserito lo specificatore PAD=’NO’, nel<br />

qual caso il comportamento adottato può variare da processore a processore.<br />

Le operazioni di I/O formattate non advancing danno la possibilità di leggere o scrivere<br />

anche solo una parte di un record, lasciando il file posizionato dopo l’ultimo carattere letto<br />

o scritto piuttosto che saltare alla fine del record. Una peculiarità delle istruzioni di input<br />

non advancing è la possibilità di leggere record di lunghezza variabile e di determinarne la<br />

lunghezza. Si noti che le istruzioni di I/O non advancing possono essere utilizzate soltanto con<br />

file esterni sequenziali formattati e con formato esplicitamente dichiarato (in altre parole non è<br />

possibile avere istruzioni di I/O non advancing con formato guidato da lista o con meccanismo<br />

namelist).<br />

La sintassi per le operazioni di connessione e di lettura/scrittura di un file ad accesso<br />

sequenziale e formattato di tipo non advancing è le seguente:<br />

OPEN([UNIT=]u,FILE=fln[,FORM=’FORMATTED’],[ACCESS=’SEQUENTIAL’] &<br />

[,RECL=rl][,IOSTAT=ios][,STATUS=st][,ACTION=act] &<br />

[,DELIM=del][,PAD=pad][,POSITION=pos])<br />

READ([UNIT=]u,[FMT=]fmt[,IOSTAT=ios],ADVANCE=’NO’)<br />

WRITE([UNIT=]u,[FMT=]fmt[,IOSTAT=ios][,SIZE=size],ADVANCE=’NO’)<br />

dove alla variabile size , quando è presente il relativo specificatore, è assegnato come valore<br />

il numero dei caratteri letti in input mentre l’espressione fmt può essere l’etichetta di una<br />

istruzione FORMAT o una espressione stringa specificante una formato contestuale, ma non può<br />

essere un asterisco.<br />

Come esempio di istruzione di I/O formattata non advancing si può considerare il seguente<br />

frammento di programma:<br />

INTEGER, DIMENSION(9) :: vett=(/1,2,3,0,0,9,8,8,6/)<br />

...<br />

DO i=1,3<br />

WRITE(11,’(I1)’,ADVANCE=’NO’) vet(i)<br />

END DO<br />

WRITE(11,’(A1)’,ADVANCE=’NO’) "-"<br />

DO i=4,6<br />

WRITE(11,’(I1)’,ADVANCE=’NO’) vet(i)<br />

END DO

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!