Tratarea erorilor
Nume
perror - afiseaza un mesaj de eroare sistem
Declaratie
void perror(const char *s);
#include <errno.h>
const char *sys_errlist[];
int sys_nerr;
Descriere
Rutina perror afiseaza un mesaj la iesirea standard de eroare, care descrie ultima eroare intilnita la ultimul apel 323g63d sistem sau functie de biblioteca. Mai intii se afiseaza argumentul s, apoi virgula si blanc, si in final mesajul de eroare si new-line. Se recomanda (mai ales pentru depanare) ca argumentul s sa includa numele functiei in care a aparut eroarea. Codul erorii se ia din variabila externa errno
Lista globala de erori sys_errlist[] indexata cu errno poate fi folosita pentru a obtine mesajul de eroare fara new-line. Ultimul indice de mesaj din lista este sys_nerr-1. Se recomanda o atentie deosebita in cazul accesului direct la lista deoarece unele coduri noi de eroare pot lipsi din sys_errlist[]
Daca un apel sistem esueaza variabila errno indica codul erorii. Aceste valori pot fi gasite in <errno.h>. Functia perror serveste la afisarea acestui cod de eroare intr-o forma lizibila. Daca un apel terminat cu eroare nu este imediat urmat de un apel perror, valoarea variabilei errno se poate pierde daca nu e salvata.
Nume
clearerr feof ferror - verifica si reseteaza starea
fluxului
Declaratie
void clearerr(FILE *flux);
int feof(FILE *flux);
int ferror(FILE *flux);
int fileno( FILE *flux);
Descriere
Functia clearerr sterge indicatorii de sfirsit de fisier si eroare ai fluxului.
Functia feof testeaza indicatorul de sfirsit de fisier al fluxului, si returneaza non-zero daca este setat. Acesta este setat daca o operatie de citire a detectat sfirsitul de fisier.
Functia ferror testeaza indicatorul de eroare al fluxului, si returneaza non-zero daca este setat. Acesta este setat daca o operatie de citire sau scriere a detectat o eroare (datorata de exemplu hardware-ului).
Functiile de citire (cu sau fara format) nu fac distinctie intre sfirsit de fisier si eroare, astfel ca trebuie apelate functiile feof si ferror pentru a determina cauza.
Functia fileno examineaza argumentul flux si returneaza descriptorul asociat de sistemul de operare acestui flux.
Atentie! Este foarte frecventa folosirea incorecta a functiei feof pentru a testa daca s-a ajuns la sfirsitul fisierului. Nu se recomanda in nici un caz acest stil de programare:
#define LSIR 80
char lin[LSIR];
FILE *fi,*fo;
fi=fopen(nume-fisier-intrare,'rt');
fo=fopen(nume-fisier-iesire,'wt');
while (!feof(fi))
fclose(fi); fclose(fo);
In aceasta secventa, daca si ultima linie a fisierului text de intrare este terminata cu new-line, aceasta va fi scrisa de doua ori in fisierul de iesire. De ce? Dupa ce se citeste ultima linie inca nu este pozitionat indicatorul de sfirsit de fisier, deci functia fgets returneaza succes. La reluarea ciclului se incearca un nou fgets si abia acum se depisteaza sfirsitul de fisier, fapt marcat in zona rezervata fluxului fi. Astfel continutul tabloului lin ramine nemodificat si este scris a doua oara in fisierul de iesire. Abia la o noua reluare a ciclului functia feof ne spune ca s-a depistat sfirsitul de fisier.
In acest manual sint prezentate mai multe programe care efectueaza diferite prelucrari asupra unor fisiere text. Pentru simplitate toate programele presupun ca nu apar erori la citire sau la scriere.
|