Newsgroup: it.comp.lang.c
Titolo: fgets

printf("Inserire nome e percorso del file\n");
fgets(buffer,128,stdin);
if((fp=fopen(buffer,"a+"))==NULL)
  printf("Errore nell'apertura del file\n");
............
.......
Scusate pensavo che usare la funzione fgets fosse meglio che usare gets e
quindi la uso per fare tutto solo che nel frammento di codice che ho
riportato sopra,se uso fgets mi riporta errore nell'apertura del file ,
mentre se uso gets tutto va bene.Volevo un chiarimento su questa funzione.
grazie a tutti.

ansimous wrote:

Infatti e` meglio fgets, anzi, gets non va usata: non permette di 
specificare la dimensione del buffer, e si rischia di sforarlo.
fgets ha questo prototipo:
char * fgets(char *s, int size, FILE *stream);
cioe` legge al piu` size bytes da stream, li copia in s e vi aggiunge un 
'\0' terminatore; la lettura si ferma se incontra un '\n', un EOF oppure ha 
letto tutti i size caratteri. Ritorna s se tutto va bene, NULL se trova un 
errore o se ha incontrato un EOF.
La puoi usare cosi`:
char buf[256];
...
while (fgets(buf, sizeof(buf)-1, stdin)){...}
Ciao,
Cecco

 
Mi son scordato l'errore: probabilmente tu passi a fgets una stringa piu` 
lunga di 128 bytes, per cui in buffer viene memorizzato un path errato per 
il file da aprire; prova a fare un printf(buffer) subito dopo la fgets, 
altrimenti printf(strerror(errno)) per vedere quale e` l'errore (dopo la 
fopen).
il fatto che con gets vada tutto bene e` un caso, dal momento che 
sicuramente vai a scrivere in zone di memoria accessibili.
Ciao
Cecco

 cioe` legge al piu` size bytes da stream,
Legge al massimo size-1, l'ultimo carattere lo usa per memorizzarci '\0'.
Ovviamente,inserendo fgets in un while(), e' possibile leggere un numero
qualsiasi nulero di caratteri a blocchi di dimensione massima size-1.
C:\>iao Angelo
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Legge al massimo size-1, l'ultimo carattere lo usa per memorizzarci '\0'.
E`vero, pensavo che lo spazio per il '\0' lo si dovesse comprendere nel 
buffer, invece include anche quello.
Ciao, 
Cecco

 mentre se uso gets tutto va bene.Volevo un chiarimento su questa funzione.
Credo che fgets copi anche il  '\n'  a fine linea,
per cui ti ritrovi un '\n' aggiunto alla fine del nome del file.
Per cui prima di usare il nome del file,devi togliere l'ultimo carattere.
ciao
emilio


 * Cut "DO NOT DISTURB" to reply */

ansimous wrote:

Primo scusate il mio male italiano. Io leggio questo gruppe per studiare 
la lingua italiana. So un po parlare ma non scrivere :( 
La funzione fgets() non sposta il '\n'.
 fgets(buffer, 128, stdin);
 if( *buffer && strlen(buffer)-1 == '\n' )
        buffer[strlen(buffer)-1] = '\0';
 if( (fp = fopen(buffer, "a+")) == NULL )
        /* ... */
Auguri dalla germania, Claudio.

  if( *buffer && strlen(buffer)-1 == '\n' )
 
if( *buffer && buffer[strlen(buffer)-1] == '\n' )
Non e' una buona idea, usare il resulto die fgets(), senza controllare, 
se forse tornava con un errore.
Auguri, Claudio.

 Auguri dalla germania, Claudio.
Grazie !  Ricambio.
ciao
emilio

 Credo sia un buon metodo se vuoi conservare l'intera linea di input.
Avevate ragione da quello che ho capito fgets aggiunge il carattere di nuova
riga(\n) alla stringa,infatti adesso il file viene aperto
corretamente.Dall'esempio che avete fatto non ho capito una cosa, cioe'
*buffer && cosa vuol dire?
per caso che il buffer deve essere null?
grazie
saluti ansimous

 per caso che il buffer deve essere null?
E' solo per controllare che il buffer non contenga la stringa vuota  "",
cioe' che buffer[0] non sia nullo.
Se cosi' fosse l'espressione   buffer[strlen(buffer)-1]
risulterebbe uguale a   buffer[-1]   ....
che credo sia un tantino illegale,
e comunque pericoloso perche' cercherebbe poi di scrivere fuori dall'array.
Quindi usiamo la proprieta' di  &&  di non valutare
il secondo argomento quando il primo e' falso
per evitare situazioni pericolose.
Non dovrebbe accadere che  buffer[0]  sia nullo,
perche' dovrebbe esserci il testo copiato da  fgets()
( che a sua volta dobbiamo controllare per vedere che
legga effettivamente cio' che deve )
E al limite dovrebbe contenere almeno un   '\n' ....
...ma programmando e' sempre meglio un controllo in piu'
che uno in meno  ( IMHO )
ciao
emilio