18.08.2013 Views

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

Dalla A alla Z passando per C - Robotica

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

condizionali controllano che il puntatore ritornato sia non nullo, ovvero che il file sia stato a<strong>per</strong>to<br />

correttamente. In caso di errore, viene stampato un messaggio e il programma viene terminato.<br />

Il ciclo do-while continua ad eseguire fintanto che il valore di n è diverso da 0, ovvero fintanto<br />

che l’istruzione fread legge un numero di elementi diverso da 0.<br />

Con l’istruzione<br />

n = fread(buf, sizeof(int), 1024, fin);<br />

vengono letti 1024 interi, ciascuno dei quali ha dimensione sizeof(int), dal file fin, e memorizzati<br />

nel vettore buf di dimensione opportuna. Il significato dell’istruzione è quella di leggere<br />

al più 1024 elementi. Se una lettura dal file non <strong>per</strong>mette di leggerne tanti, semplicemente la<br />

funzione ritorna il numero di elementi effettivamente letti.<br />

Successivamente, l’istruzione<br />

fwrite(buf, sizeof(int), n, fout);<br />

scrive nel file fout il numero n di elementi letti, prelevandoli dal buffer buf.<br />

Al termine del ciclo, i file vengono chiusi utilizzando la funzione fclose. E’ importante<br />

chiudere un file quando esso viene scritto, altrimenti i dati potrebbero non venir memorizzati al<br />

termine del programma di scrittura. Per quanto riguarda il file in lettura, è sempre bene chiuderlo<br />

esplicitamente, anche se l’omissione dell’istruzione di chiusura non causa problemi particolari.<br />

12.6 Lettura di file di testo<br />

Per l’interazione con l’utente, quando sia necessario leggere dei dati d<strong>alla</strong> console, è preferibile<br />

usare una tecnica basata sulla funzione fgets 2 e sscanf invece che utilizzare la funzione scanf.<br />

La funzione fgets è dichiarata come segue:<br />

char *fgets(char *s, int size, FILE *stream);<br />

i parametri hanno il seguente significato<br />

• *s è il puntatore <strong>alla</strong> stringa letta;<br />

• size è il numero massimo di caratteri da restituire;<br />

• stream è il file dal quale leggere la stringa (porlo pari a stdin <strong>per</strong> leggere da tastiera).<br />

il valore di ritorno è il puntatore <strong>alla</strong> stringa stessa.<br />

La funzione sscanf è invece dichiarata come segue:<br />

int sscanf(const char *str, const char *format, ...);<br />

e il suo funzionamento è esattamente identico a quello della scanf 3 , soltanto che invece di fare il<br />

parsing dell’input proveniente direttamente d<strong>alla</strong> console stdin, viene analizzata la stringa str,<br />

cioè il primo parametro della funzione.<br />

Il programma di esempio in Figura 12.1 mostra l’utilizzo della coppia di funzioni fgets e<br />

sscanf:<br />

2 E’ disponibile anche la funzione gets, ma il suo utilizzo è sconsigliato in quanto non <strong>per</strong>mette di specificare il<br />

numero massimo di caratteri da restituire; può quindi presentare problemi di sicurezza e stabilità dei programmi,<br />

a causa dei possibili buffer overflow.<br />

3 Attenzione <strong>alla</strong> “s” in più!<br />

119

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!