Newsgroup: it.comp.lang.c
Titolo: fseek()

Cari amici, ho scoperto in questi giorni una cosa che proprio non
sapevo. Scrivendo un programma che faceva, tra le altre cose, alcune
fseek() per posizionarsi avanti e indietro su di un file di testo, avevo
dei problemi che ho poi individuato nel fatto che la fseek() stessa non
restituiva correttamente l'errore se tentavo di farla spostare
all'indietro oltre il primo carattere del file.
Su di un file HLP della Borland poi leggo:
fseek might return a 0 indicating that the pointer has been moved
successfully when in fact it has not been. This is because DOS, which
actually resets the pointer, does not verify the setting. fseek returns
an error code only on an unopened file or device.
Ora vi chiedo: è normale o è un comportamento anomalo del Borland?
Ciao a tutti.
EMG

Ora vi chiedo: č normale o č un comportamento anomalo del Borland?
E' un comportamento molto probabilmente legato alla particolare
implementazione, visto che viene citato specificamente il s.o. DOS.
fseek() non riesce a riportare un errore, perche' il sistema operativo
non le consente di farlo.
Comunque devi stare attento nell'usare fseek()/ftell() con i file di
testo. Lo standard fa una chiara distinzione tra i "text stream" e i
"binary stream".
Mentre sotto Unix queste due tipologie non hanno differenze, sotto DOS
non e' cosi'.
L'uso di fseek() o fsetpos() (nel caso di file di testo di dimensioni
tali da non essere rappresentabili con un long) e' subordinato alla
creazione di un "indicatore di posizione" ("file position indicator"),
ottenuto con ftell() o fgetpos().
Questo "bookmark" e' un'informazione opaca che garantisce, una volta
ottenutala, che passata alla prossima fseek() (se ottenuta con
ftell()) o alla prossima fsetpos() (se ottenuta con fgetpos()) il
puntatore nel file venga riposizionato sull'esatto punto precedente.
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
---------------------------------------------
#exclude <windows.h>

 "binary stream".
Quindi cosa useresti per spostarti avanti e indietro su un file di
testo?
EMG

testo?
Sempre fseek() pero' su posizioni precedentemente segnate con ftell().
Inoltre, proprio per i motivi citati, la determinazione della
lunghezza del file tramite l'uso di ftell() non e' affidabile (per i
file di testo).


 Sempre fseek() pero' su posizioni precedentemente segnate con ftell().
Ma io non posso segnarmi ogni punto in cui inizia un record. Se so che
questo č lungo nn bytes possibile che non possa in qualche modo
affidabile andare indietro a quello precedente? Forse aprendo il file in
modo binario?
EMG

modo binario?
Penso proprio di si'...


 <snip>
Oppure anche in modo testo, ma con alcune avvertenze: i dati del
record devono essere nel range [' ' - '~'], altrimenti non puoi usare
fseek cosi' come intendi tu.
Altra cosa: TUTTI i dati del file devono essere nel range suddetto, se
per caso separi i record con un '\n', fai la frittata!
Le frittate si fanno anche con '\t', '\b' e '\r'.
In modo binario, invece, niente frittate, pero' occorre fare
attenzione a chi crea i record: se li crea un msdos, una '\n'
stampera' sul file i caratteri "\n\r" (o viceversa?), mentre uno unix
ti stampa solo il carattere '\n'. Nel primo caso il record e' lungo x
caratteri, nell'altro sara' lungo x-1.
Buon divertimento :)
Andrea
-----------------+-------------------------------- .~~~.  ))
 Andrea  Rimicci | abuse @@             (\__/)  .'     )  ))
-----------------+       aritaly. com   /o o  \/     .~
                                       {o_,    \    {
 Internet Abuse Dept. Executive officer  / ,  , )    \ .
 at AR Italy.                            `~  '-' \    } ))
                                        _(    (   )_.'
---------- OS/2 V5 "Phoenix" --------- '---..{____}

stampera' sul file i caratteri "\n\r" (o viceversa?),
viceversa ;)
