Un'altra importante caratteristica del C, è che dispone di una serie di strumenti per riportare, al programmatore, gli errori commessi durante lo sviluppo. Quando si prende dimestichezza con la programmazione si apprezza l'importanza di avere degli strumenti per il debug, poiché buona parte dello sviluppo di un programma risiede proprio nella correzione degli errori; per poter utilizzare queste funzione è bene includere, oltre alla <stdio.h>, anche le librerie <stdlib.h> e <errno.h>.
Tra le funzioni più utilizzate per rilevare e gestire gli errori generati a runtime c'è perror(), usata in combinazione con errno. La sintassi della funzione è la seguente:
void perror(const char *messaggio);
La perror() produce un messaggio a video descrivendo l'ultimo errore riscontrato durante una chiamata ad una funzione di sistema o di libreria. Il messaggio che viene stampato dipende dal valore contenuto nella variabile Errno. In sostanza perror()
traduce il codice in un messaggio comprensibile all'uomo.
Errno è una variabile di sistema speciale che viene impostata se una chiamata di sistema non viene eseguita correttamente e contiene un codice che corrisponde all'errore che si è verificato e che non ha consentito la corretta esecuzione della chiamata. Perché possa essere usata in un programma deve essere dichiarata come segue:
extern int errno;
Possiamo azzerarla o assegnarle i valore che vogliamo, altrimenti ritorna l'ultimo valore ritornato da una funzione di sistema o di libreria.
La funzione exit(), invece, si presenta con la seguente struttura:
void exit(int stato);
e serve essenzialmente per terminare l'esecuzione di un programma e ritornare il valore "stato" al sistema operativo, che può assumere essenzialmente questi due valori:
EXIT_SUCCESS
- nel caso in cui il programma termini senza problemi;EXIT_FAILURE
- nel caso in cui il programma termini con errori.
ESEMPIO PRATICO
(Visualizza il sorgente completo)
Il programma utilizza le funzioni di lettura e scrittura su file per leggere e salvare il file "rubrica.txt". La particolarità del programma è che salva in formato CSV (Comma Separated Value), formato che permette a programmi di posta come Outlook o Mozilla di importare i dati senza problemi.
LETTURA
472 FILE *stream = fopen("rubrica.txt","rt");
[...]
475 while(fgets(linea, 500, stream) != NULL)
[...]
510 fflush(stream);
511 fclose(stream);
SCRITTURA
525 FILE *stream = fopen("rubrica.txt","w");
[...]
532 fprintf(stream, "%s,%s,%s,%s,%sn", p->inf.nome, p->inf.cognome, p->inf.telefono, p->inf.email, p->inf.sitoweb);
[...]
539 fflush(stream);
540 fclose(stream);
Nota particolare va a "getchar", utilizzata per scrivere una funzioncina che permette all'utente di leggere i dati una schermata per volta; grazie a getchar si può continuare l'esecuzione premendo invio.
573 void pausa()
574 { // pausa() - OPEN
575
576 char invio;
577 printf("nn - premi INVIO per continuare -n");
578 invio = getchar();
579 return;
580
581 } // pausa() - CLOSE