Newsgroup: it.comp.lang.c
Titolo: Cosa significa? [2]

A parte la dichiarazione "classica", cosa fa questa funzione?
La while preleva caratteri dal file finchè questi sono: o fine riga o EOF,
giusto?
Ma il "-1"? E' un controllo su eventuali errori?
#########
void inizio_row(FILE *d_file)
{
int ck;
while((ck=fgetc(d_file))!=10 && (feof(d_file)==0));
if (ck==-1) {
	fseek(d_file,0L,SEEK_SET);
	}
}
#########
Come al solito grazie a chi potrà illuminarmi.
There is NOSPAM in my signature ;-)

 
[...]
fgetc(), se non sbaglio, torna il carattere letto 0...255 o EOF in caso
di fine del file di input.
-- 
 Ciao, Luca.
 Reply to 
luca....@tiscalinet.it

di fine del file di input.
E' proprio quello che mi turba :-)
... dovrebbe tornare un unsigned char (convertito ad int) e quando mai potrebbe
tornare -1?


 tornare -1?
In teoria mai, in pratica potrebbe essere EOF == -1, ma fare questa
assunzione farebbe perdere l'utilita' della macro EOF, che serve
esclusivamente per garantire la portabilita' del codice.


 tornare -1?
No, fgetc() restituisce un int.
EMG

Ma il "-1"? E' un controllo su eventuali errori?
-1 è il valore che solitamente si associa alla costante EOF
Le funzioni e macro sul modello di fgetc() (getc() e getchar())
restituiscono sempre un valore intero (non un char, nè un unsigned
char).
Il fatto che non restituiscano un char (o un unsigned char) è motivato
dalla necessità di restituire il valore di fine file e nell'incapacità
di rappresentarlo senza che vi sia ambiguità con un qualsiasi
carattere che possa essere presente nel file.
In parole semplici : se fgetc() restituisse dei valori nell'intervallo
0..255, non avanzerebbe alcun valore che possa rappresentare la fine
del file.
Viene quindi restituito un intero in modo da rappresentare l'EOF con
-1 o, comunque, con un valore diverso da qualsiasi altro compreso
nell'intervallo dei char.
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

>-1 è il valore che solitamente si associa alla costante EOF
bene.
percio' la funzione posiziona il puntatore al file
o sul fine riga successivo
o all'inizio del file (nel caso si sia arrivati ad EOF)
esatto?
se si', nel primo caso, quale carattere sarebbe prelevato ad un successivo
fscanf?
grazie ancora


>No, fgetc() restituisce un int.
effettivamente è così ma citavo il K&R che alla descrizione della funzione
int fgetc(FILE *stream)
dice:
" fgetc fornisce, come unsigned char (convertito ad int) il successivo carattere
contenuto in stream, oppure EOF se incontra la fine del file"
Ora chiedo: il fatto che il manuale sottolinei l'esistenza della conversione
dovrebbe porre l'attenzione su eventuali casi di "warnig"; quale potrebbe
essere, per esempio, uno di questi?
grazie


essere, per esempio, uno di questi?
Il problema è che, se fgetc() considerasse il carattere letto
semplicemente come "char" e non come "unsigned char", nella
conversione ad intero esso potrebbe risultare negativo.
I char, difatti, non hanno un segno predefinito, su alcune piattaforme
sono "signed" e su altre "unsigned", e quindi il loro valore intero
dipende da come l'architettura della macchina in questione trasforma i
caratteri in interi, se estendendo il segno o meno.
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

fscanf?
Forse vuoi dire ad un successivo fgetc().
Il carattere prelevato č quello presente di seguito nel buffer.
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

 dovrebbe porre l'attenzione su eventuali casi di "warnig";
No, in quanto la conversione č all'interno del corpo della funzione, non
all'esterno. Per il chiamante, fgetc() restituisce _sempre_ un int.
EMG

 o all'inizio del file (nel caso si sia arrivati ad EOF)
Né l'uno né l'altro. La posizione del puntatore al file non ricordo se,
in una situazione di EOF, sia stabilita dallo standard e comunque non ci
interessa. Sappiamo che il file non può essere più letto e che ogni
eventuale successivo tentativo di lettura ci darà EOF.
EMG

eventuale successivo tentativo di lettura ci darà EOF.
Lui si riferiva probabilmente alla successiva chiamata a fseek().
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)

>Lui si riferiva probabilmente alla successiva chiamata a fseek().
Io ho nel codice che sto analizzando ho chiamate successive come segue
fscanf(fdata,"%d",&(in->tp_s));
inizio_row(fdata);
fscanf(fdata,"%d",&(glob->startnb));
inizio_row(fdata);
fscanf( ....
ecc ...
a quanto ho capito dovrebbe: 
prelevare il dato,
saltare tutto cio' che segue tale dato appena prelevato e posizionarsi
all'inizio riga successivo,
alchè prelevare il dato successivo posto nella riga dopo .... ecc
giusto?
sempre grazie!


giusto?
Sě, il principio č questo, perň non capisco perchč complicarsi la vita
quando si potrebbe leggere fino a fine stringa tranquillamente anche
con fscanf(), basta usare il formato "%s%[^\n]\n".
--
Andrea Laforgia        (
andrea_...@bigfoot.com
)