[Avanti]  [Indietro]  [Su]  

7.2.7 Posizionamento su uno stream

Come per i file descriptor anche per gli stream è possibile spostarsi all'interno di un file per effettuare operazioni di lettura o scrittura in un punto prestabilito; sempre che l'operazione di riposizionamento sia supportata dal file sottostante lo stream, quando cioè si ha a che fare con quello che viene detto un file ad accesso casuale.9

In GNU/Linux ed in generale in ogni sistema unix-like la posizione nel file è espressa da un intero positivo, rappresentato dal tipo off_t, il problema è che alcune delle funzioni usate per il riposizionamento sugli stream originano dalle prime versioni di Unix, in cui questo tipo non era ancora stato definito, e che in altri sistemi non è detto che la posizione su un file venga sempre rappresentata con il numero di caratteri dall'inizio (ad esempio in VMS può essere rappresentata come numero di record, più l'offset rispetto al record corrente).

Tutto questo comporta la presenza di diverse funzioni che eseguono sostanzialmente le stesse operazioni, ma usano parametri di tipo diverso. Le funzioni tradizionali usate per il riposizionamento della posizione in uno stream sono fseek e rewind i cui prototipi sono:

L'uso di fseek è del tutto analogo a quello di lseek per i file descriptor, ed i parametri, a parte il tipo, hanno lo stesso significato; in particolare whence assume gli stessi valori già visti in sez. 6.2.3. La funzione restituisce 0 in caso di successo e -1 in caso di errore. La funzione rewind riporta semplicemente la posizione corrente all'inizio dello stream, ma non esattamente equivalente ad una fseek(stream, 0L, SEEK_SET) in quanto vengono cancellati anche i flag di errore e fine del file.

Per ottenere la posizione corrente si usa invece la funzione ftell, il cui prototipo è:

La funzione restituisce la posizione corrente, o -1 in caso di fallimento, che può esser dovuto sia al fatto che il file non supporta il riposizionamento che al fatto che la posizione non può essere espressa con un long int

la funzione restituisce la posizione come numero di byte dall'inizio dello stream.

Queste funzioni esprimono tutte la posizione nel file come un long int. Dato che (ad esempio quando si usa un filesystem indicizzato a 64 bit) questo può non essere possibile lo standard POSIX ha introdotto le nuove funzioni fgetpos e fsetpos, che invece usano il nuovo tipo fpos_t, ed i cui prototipi sono:

Le funzioni ritornano 0 in caso di successo e -1 in caso di errore.

In Linux, a partire dalle glibc 2.1, sono presenti anche le due funzioni fseeko e ftello, che sono assolutamente identiche alle precedenti fseek e ftell ma hanno argomenti di tipo off_t anziché di tipo long int.


[Avanti]  [Indietro]  [Su]  
© 2000-2003 Simone Piccardi
Pubblicazione web curata da Mirko Maischberger