Newsgroup: it.comp.lang.c
Titolo: FAQ 9 -versione definitiva -Acquisire da file una stringa intera, terminata da \n

3i - Acquisire da file una stringa intera, terminata da \n
Un problema comune che si presenta durante l'acquisizione di dati da un file
di testo è quello di caricare da esso un' intera stringa contenente spazi. L
'uso di fscanf() a questo scopo è sconsigliato, a meno che non si conosca
esattamente il formato delle righe del file di input, perché considera lo
spazio nella stringa come un delimitatore di formato. Perciò, avendo un file
contenente la seguente stringa:
questa è una stringa
tentando di leggerlo in questa maniera:
char stringa[40];
fscanf(nomefile,"%s",stringa);
printf("%s",stringa);
otterremo in output solamente: questa
Inoltre fscanf() non dispone di un meccanismo di controllo sulla dimensione
dell'input, per cui se la prima parola fosse (nell'esempio sopra) di più di
40 caratteri (in tedesco potrebbe succedere!) la fscanf() scriverebbe
tranquillamente i caratteri in eccesso su aree di memoria non libere,
causando cose poco piacevoli!
La risposta a questi problemi sta nell'uso della funzione:
char *fgets(char *s, int n,FILE *fp);   definita in stdio.h       Esempio:
fgets(stringa,40,filepoint);
Essa acquisisce dal file puntato da fp al massimo n-1 caratteri (altrimenti
si ferma quando trova il carattere newline '\n') che scrive nella stringa s,
a cui aggiunge il carattere '\0'. Se l'operazione ha avuto successo, essa
ritorna il puntatore alla stringa, altrimenti un puntatore nullo.
Per riassumere, la funzione fgets() è più sicura e permette l'input da files
privi di formato omogeneo; mentre fscanf()  è da preferire quando il file ha
formato fisso e magari contenente diversi tipi di dato, che possono, con
essa, essere automaticamente caricati nelle opportune variabili.
--
Marco Coppo
University Of Sheffield

 fgets(stringa,40,filepoint);
[ snip ]
Può essere utile ricordare di eliminare il '\n' finale, se è il caso:
       char *c;
       ...
       if ((c = strchr(stringa, '\n'))) *c = '\0';
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

 wrote in message
884m2u$mi$1...@fokhouse.iol.it...
Può essere utile ricordare di eliminare il '\n' finale, se è il caso:
       char *c;
       ...
       if ((c = strchr(stringa, '\n'))) *c = '\0';
Ti ringrazio molto per il tuo contributo alla correzione non solo di questa,
ma anche delle altre FAQs.
Non sono sicuro però di questo commento. Dalla documentazione dei miei
compilatori ( Borland & Lcc) risulta che fgets non inserisce il newline
nella stringa, per cui il problema da te citato non si pone. Si pone semmai
il problema opposto, ovvero, durante la scrittura della stringa in un altro
file, è necessario aggiungere il newline se si vuole che "si vada a capo"
nel file.
fammi sapere.
ciao ciao
Marco

Marco Coppo wrote:
Si, il carattere new line e' inserito nel buffer da fgets.
Ivan Molella

 nella stringa, per cui il problema da te citato non si pone. 
[root@fokhouse /root]# man fgets | col -b | grep -A 4 ^' \+fgets'
       fgets()  reads  in  at  most one less than size characters
       from stream and stores them into the buffer pointed to  by
       s.  Reading stops after an EOF or a newline.  If a newline
       is read, it is stored into the buffer.  A '\0'  is  stored
       after the last character in the buffer.
[root@fokhouse /root]#
_Tutta_ la documentazione in mio possesso (compresi K&R e C.FAQ) descrive 
questa caratteristica di fgets(). 


 wrote in message
8868hv$1cm$1...@fokhouse.iol.it...
_Tutta_ la documentazione in mio possesso (compresi K&R e C.FAQ) descrive
questa caratteristica di fgets().
Ciao ciao,
Andrea
E quando uno ha ragione ha ragione! Chiedo scusa, ho letto di fretta e
quindi male.
Ancora scusa e grazie per la correzione
ciao


nella stringa, per cui il problema da te citato non si pone.
fgets() non lo rimuove mentre gets() si.