|
Resource temporary unavailable 20.Invalid enviroment 21.Invalid format
|
səhifə | 16/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| Resource temporary unavailable 20.Invalid enviroment 21.Invalid format
22.Invalid function number 23.Invalid memory block addres 24.Is a direc-
tory 25.Math arrgument 26.Memory arena trashed 27.Name too long 28.No
child processes 29.No more files 30.No space left on device 31.No such
device 32.No such device or address 33.No such file or directory 34.No
such process 35.Not a directory 36.Not enough memory 37.Not same device
38.operation not permitted 39.Path not found 40.Permission denied
41.Possible deadlock 42.Read-only file system 43.Resource busy 44.Re-
source temporary unavailable 45.Result too large 46.Too many links
47.Too many open files.
-107- [ stdio.h - clearerr() ]
FUNCTIA clearerr()
-reseteaza indicatorul de eroare pentru un stream(o fila virtuala)
SINTAXA GENERALA este: void clearerr(FILE *stream)
Functia are efect doar pentru fluxul de date(stream) indicat prin *stream,
nu si asupra erorilor de sistem.Apelarea functiei determina resetarea la
zero a erorii inregistrate pentru fluxul respectiv si respectiv resetarea
indicatorului EOF(sfarsitul filei).Indicatorul EOF este resetat dupa fie-
care operatie de input.Functia nu returneaza nici o valoare.
Stergerea indicatorului de eroare se poate face si apeland una dintre
functiile: fseek(),fsetpos() sau rewind().
EXEMPLU: #include
#include
#include
FILE *flux;
char ch;
main()
{
flux=fopen("TEXT.txt ","w");
ch=fgetc(flux);
eroare();
printf("\n Dupa apelarea functiei clearerr:");
clearerr(flux);
eroare();
}
eroare()
{
if ferror(flux)
{
perror("\n Eroarea este");
}
else
{
printf("\n Nici o eroare in flux !");
}
sleep(5);
}
Eroarea este generata de incercarea de a citi o fila deschisa exclusiv
pentru scriere(cu w).Pentru identificarea erorii am utilizat functia
ferror() inclusa intr-o functie denumita eroare().Observati ca daca uti-
lizam functia perror(),mesajul de eroare ramane nemodificat,deoarece
functia actioneaza doar asupra erorilor din stream(din fluxul de date
deschis in memoria de operare) si nu influenteaza datele arhivate in
variabilele de sistem desemnate pentru inregistrarea erorilor.Functia se
poate utiliza pentru a distinge erorile din memoria de operare(din stream)
de cele de sistem.
FUNCTIA strerror()
-returneaza un pointer catre un mesaj de eroare
SINTAXA GENERALA este: char *strerror(int errnum);
Functia preia parametrul numeric din variabila de sistem errnum si retur-
neaza un pointer catre mesajul de eroare asociat numarului respectiv.
-108- [ stdio.h - strerror() ]
Daca functia este executata cu succes,returneaza un pointer spre
sirul de caractere ce formeaza mesajul de eroare.Mesajul de eroare pre-
luat va fi construit intr-un tampon de memorie(buffer) temporar,care este
suprascris la fiecare apelare a functiei(tamponul de memorie este practic
o variabila care actioneaza doar la nivel de memorie de operare,sau
altfel spus este un mic fragment din memoria de operare rezervat doar
pentru acest scop).
Functia se aplica pentru erorile de sistem.
EXEMPLU: #include
#include
#include
FILE *flux;
char *text;
main()
{
fopen(" * ","r");
text=strerror(errno);
printf("Eroarea este: %s\n",text);
sleep(5);
}
Eroarea este generata de faptul ca am desemnat o fila inexistenta(" * ").
Functia nu afiseaza mesajul de eroare ci doar genereaza pointerul spre
mesajul preluat cu ajutorul variabilei errno.
FUNCTIA _strerror()
-construieste un mesaj,din ultimul mesaj de eroare si un text predefinit
SINTAXA GENERALA este: char *_strerror(const char *s);
Functia construieste un mesaj format din textul predefinit de catre pro-
gramator si arhivat in constanta de tip caracter *s,la care adauga ulti-
mul mesaj de eroare pe care il preia la fel ca si functia strerror().
Diferenta consta in faptul ca permite si adaugarea unui text personalizat.
Daca nu adaugati nici un mesaj propriu,returneaza doar ultimul mesaj de
eroare arhivat.Sirul precizat de d-voastra poate contine maximum 94 de
caractere(pentru a putea fi inclus in buffer).
Daca functia a fost executata cu succes,returneaza un pointer catre
mesajul de eroare ce se construieste in buffer si poate fi afisat cu
printf().Mesajul este preluat din _sys_errlist de catre variabila errno.
EXEMPLU: #include
#include
#include
FILE *flux;
char text[40]="\n Eroarea de flux este: !";
main()
{
flux=fopen("*","w");
rename("Fila1","Fila1");
printf(_strerror(text));
sleep(5);
}
Observati ca functia returneaza doar ultima eroare(prima este suprascrisa)
Functia nu este in standard ANSI si nu este portabila in unele versiuni.
-109- [ stdio.h - setbuf() ]
FUNCTIA setbuf()
-ataseaza un tampon de memorie unui stream (unei file virtuale)
SINTAXA GENERALA este: void setbuf(FILE *stream,char *buf);
Un tampon de memorie este echivalentul unei variabile de memorie in care
datele sunt stocate temporar,inainte de a fi scrise in memorie.Au diverse
aplicatii si utilizari,dintre care cele mai frecvente sunt cele pentru
filtrarea datelor sau pentru selectionarea lor.De exemplu;-mesajele din
retea transmise secvential pe un port serial sunt de obicei stocate in
tampoane de memorie,de unde sunt preluate ulterior in ordinea selectata
de catre utilizator,sau sunt sterse fara a modifica memoria interna.
Functia setbuf() determina inlocuirea tamponului de memorie alocat
automat prin cel desemnat de catre variabila buf.Functia poate fi aplicata
doar dupa deschiderea fluxului de date.Practic functia controleaza tam-
ponul memoriei de operare.Daca valoarea desemnata prin buf este nula,
atunci fluxul de date va fi netamponat(datele se vor scrie direct in fila
deschisa).Dimensiunea implicita a tamponului este determinata de constanta
BUFSIZ definita in stdio.h(de exemplu 512 bytes).Fluxurile de date stan-
dard(stdin,stdout si stderr) sunt netamponate(daca nu sunt redirectionate)
dar pot fi tamponate prin apelarea functiei setbuf().
In absenta unui tampon de memorie,datele sunt scrise direct in fila,sau
respectiv pe dispozitivul de iesire(ecran,imprimanta),in timp ce in pre-
zenta unui tampon,datele se acumuleaza in tamponul de filtrare pana cand
se umple tot tamponul de memorie,sau pana cand sunt eliberate cu fflush().
La eliberarea tamponului datele se transfera sub forma de bloc de date.
Functia nu returneaza nici o valoare.Functia a fost inlocuita in versiu-
nile recente de catre functia setvbuf().
EXEMPLU: #include
#include
#include
char tampon[BUFSIZ];
char x;
main()
{
printf("Se ataseaza un tampon de memorie pentru STDOUT !\n");
sleep(2);
printf("Se introduc date in tamponul de memorie ! \n\n");
setbuf(stdout,tampon);
puts("Acesta este un test pentru tamponul de memorie! \n");
puts("Datele se acumuleaza in tamponul de memorie \n");
puts("dar nu vor fi afisate \n");
puts("decat cand se umple tamponul sau cand eliberam fluxul\n");
printf(Tamponul are o lungime de:\n");
printf("%d\n",BUFSIZ);
printf("bytes\n");
sleep(5);
clrscr();
fflush(stdout);
sleep(15);
}
Tampoanele se pot utiliza pentru a selecta date formatate.Pentru evitarea
erorilor,functia setbuf() se va apela imediat dupa deschiderea fluxului.
-110- [ stdio.h - setvbuf() ]
FUNCTIA setvbuf()
-asociaza un tampon de memorie unui stream
SINTAXA GENERALA:int setvbuf(FILE *stream,char *buf,int type,size_t size);
unde: FILE *stream -este fluxul la care se asociaza tamponul
char *buf -este tamponul atribuit (pointerul spre acesta)
int type -este tipul de tamponare si poate fi:
_IOFBF=tamponare completa,adica operatiile de introducere si de
preluare a datelor se fac pana la epuizarea tamponului
_IOLBF=tamponarea liniei,adica introducerea datelor se face pana
la umplerea tamponului iar preluarea de date se face cand
intervine primul caracter newline(la capatul liniei)
_IONBF=fila netamponata,adica se vor ignora parametrii buf si
size,toate operatiile se vor face direct in fila deschisa
size_t size -determina dimensiunea tamponului.Trebuie sa fie mai
mare decat zero iar dimensiunea sa maxima este determi-
nata de constanta UINT_MAX definita in .Poate
lua valori intre 2 si 32768 iar in mod intern valoarea
va fi rotunjita pana la un multiplu de 2.
Functia este similara cu setbuf(),dar permite atat alocarea cat si dimen-
sionarea tamponului si returneaza o valoare de control.Daca functia a
fost executata cu succes returneaza zero iar in caz contrar nonzero.
Principalele erori sunt determinate de tipul incorect de tamponare,de
dimensiunea inadecvata sau de lipsa spatiului de memorie in memoria de
operare.Functia se poate aplica doar dupa deschiderea filei(stream).
Daca tamponul specificat prin buf returneaza o valoare nula,se va atribui
automat un tampon utilizand functia malloc(),iar tamponul alocat va avea o
dimensiune de size/2 * 2 bytes(adica egala cu size).
Stream-urile standard stdin si stdout sunt netamponate.Functia se utili-
zeaza pentru filtrarea datelor(Exemplu:filtre de format ="antivirus").
EXEMPLU: #include
#include
FILE *flux1;
char tampon[512];
char text[300];
int numar;
main()
{
flux1=fopen("Text.txt","w+");
printf("Se ataseaza un tampon,apoi se introduc date ! \n");
numar=setbuf(flux1,tampon,_IOFBF,512);
sleep(2);
fwrite("Text pentru verificare tamponului",1,50,flux1);
printf("%d\n",numar);
sleep(5);
printf("Eliberam tamponul:\n");
fflush(flux1);
flux1=fopen("Text.txt","r+");
fread(&text,1,50,flux1);
printf("%s\n",text);
sleep(5);
}
-111- [ stdio.h -fflush() ]
FUNCTIA fflush()
-elibereaza un stream (elibereaza fila din memoria de operare)
SINTAXA GENERALA este: int fflush(FILE *stream);
Functia elibereaza fluxul de date din memoria de operare.In caz ca a
avut asociat si un tampon de memorie,datele din tampon vor fi scrise in
bloc in fila deschisa,inainte de a elibera tamponul.Dupa apelarea functiei
fflush() fila ramane deschisa pentru alte operatii ulterioare.Functia nu
are nici un efect asupra filelor netamponate.
Daca functia a fost executata cu succes,returneaza zero iar in caz de
eroare returneaza EOF.Daca nu se precizeaza fila,functia fflush(NULL)
elibereaza toate filele deschise(toate fluxurile).
In mod normal,tampoanele asociate filelor deschise sunt controlate de
catre sistemul de operare,care alege momentul oportun pentru transferarea
datelor din tampon pe disc(la umplerea tamponului,la inchiderea filei etc)
Functia fflush() se utilizeaza pentru a determina momentul eliberarii
tamponului asociat unei file deschise in memoria de operare.
EXEMPLU: #include
#include
FILE *ecran;
char tampon[512];
main()
{
printf("Utilizam un tampon de filtrare a datelor: \n\n");
ecran=fopen("Text.txt","a+");
setbuf(stdout,tampon);
puts("Mesaj evidentiat la eliberarea tamponului !");
sleep(5);
fflush(stdout);
sleep(5);
}
FUNCTIA flushall()
-elibereaza toate fluxurile de date(streams)
SINTAXA GENERALA este: int flushall(void);
Functia elibereaza toate tampoanele asociate filelor deschise in memoria
de operare si scrie datele din tampoane in filele la care sunt asociate.
Dupa o operatie de flushall(),orice operatie de citire a datelor se va
face din filele respective(deoarece tampoanele au fost golite de date).
Functia returneaza numarul de fluxuri eliberate(care raman deschise).
In caz de eroare,functia nu returneaza nimic.
In mod normal,tampoanele de memorie sunt controlate de catre sistemul de
operare.In cazul in care operati cu date care doriti sa fie scrise direct
pe disc instantaneu,in limbajul C++ puteti sa legati toate filele de tip
obiect de COMMODE.OBJ.In acest caz,in fila executabila rezultata toate
apelarile functiei _flushall vor scrie continutul tampoanelor direct pe
disc(in limbajul C++ functia este implementata ca _flushall(),ca de altfel
un numar destul de mare de functii precedate de _ ).
In situatiile obisnuite,este preferabil sa lasati sistemul de operare sa
controleze tampoanele de memorie,deoarece rutinele de control pot fi
uneori destul de anevoioase si pot determina rezultate imprevizibile prin
fragmentarea sau chiar pierderea de date semnificative.
-112- [ stdio.h - flushall() ]
Functia flushall() este foarte utila atunci cand dispuneti de o memorie
de operare foarte limitata iar datele din tampoanele de memorie nu afec-
teaza executia programului.Atentie insa atunci cand in tampoanele de
memorie sunt stocate date care influenteaza executia programului.
EXEMPLU: #include
#include
#include
char tampon[512];
FILE *flux1;
FILE *flux2;
FILE *flux3;
int nr;
main()
{
clrscr();
printf("Deschidem trei file virtuale si introducem mesaje:\n");
flux1=fopen("Fila1.txt","r+");
setvbuf(stdout,tampon,_IOFBF,512);
puts("Mesajul cu numarul 1 \n");
flux2=fopen("Fila2.txt","w+");
puts("Mesajul cu numarul 2 \n");
flux3=fopen("Fila3.txt","a+");
puts("Mesajul cu numarul 3 \n");
printf("Mesajele apar dupa resetarea/eliberarea tamponului\n");
sleep(7);
clrscr();
nr=flushall();
printf("%d",nr);
flushall();
sleep(5);
}
Observati ca functia flushall() returneaza 8,corespunzator filelor si
streamurilor eliberate(flux1,flux2,flux3,Fila1,Fila2,Fila3,stdout,tampon).
Functia este utila si in timpul muncii de programare,in cazul in care
memoria de operare este blocata cu mesaje de eroare si/sau date inutile.
FUNCTIA fscanf()
preia date formatate din stream(din fila virtuala deschisa in memorie)
SINTAXA GENERALA este:
int fscanf(FILE *stream,const char *format[,adress,...]);
unde: FILE *stream -desemneaza fluxul(fila) din care se preiau date
*format -specifica formatul datelor preluate
adress -este adresa de memorie in care se arhiveaza
Functia citeste campurile de date din fluxul specificat,caracter cu ca-
racter,apoi formateaza datele corespunzator cu formatul specificat si in
final arhiveaza datele la adresa specificata(adresa este optionala).
Numarul maxim de tipuri de format si respectiv de adrese de stocare a
datelor trebuie sa fie mai mic sau egal cu numarul total de campuri de
date(nu se pot solicita mai multe date decat exista in flux).
Functia returneaza numarul de campuri de date citite,formatate si arhi-
vate cu succes la adresa specificata.In caz de eroare si EOF returneaza 0.
-113- [stdio.h -fscanf() si fileno() ]
Tipurile de format al datelor se specifica la fel ca pentru functia scanf
(%d,%c,%s...etc.) sau pentru functia printf() si fprintf().(vezi printf)
Limbajul C++ accepta si functia fwscanf(),care este similara dar opereaza
doar cu caractere majuscule.
Functia este foarte utila pentru a prelua date din stream(din memoria de
operare).Principalul avantaj il reprezinta faptul ca nu necesita operatii
de scriere in memoria fizica,astfel incat se pot executa un numar foarte
mare de operatii de citire a datelor fara a uza memoria de suport.
EXEMPLU: #include
#include
FILE *dosar;
int *text;
int nr=25;
char *text1[40];
main()
{
dosar=fopen("Text.txt","w+");
fprintf(dosar,"%d",nr);
fprintf(dosar,"%s","Text_exemplificativ");
rewind(dosar);
fscanf(dosar,"%d",&text);
fscanf(dosar,"%s",&text1);
printf("\n Numarul preluat din flux este: \n");
printf("%d\n",text);
printf("Iar textul este: \n");
printf("%s",text1);
sleep(5);
}
FUNCTIA fileno()
returneaza numarul de manipulare al filei(stream)
SINTAXA GENERALA este: int fileno(FILE *stream);
Functia fileno() este de fapt un macro care returneaza numarul cu ajutorul
careia sistemul manevreaza fila respectiva in toate operatiile.In caz ca
o fila a fost deschisa de mai multe ori si are mai mult decat un singur
numar de manipulare(handle),functia va returna numarul atribuit la prima
deschidere a filei.Numarul returnat este un numar intreg.
Nu returneaza nimic in caz de eroare sau daca nu exista file deschise.
EXEMPLU: #include
#include
int nr1;
FILE *flux;
main()
{
flux=fopen("Text.txt","r");
nr1=fileno(flux);
printf("Numarul de manipulare pentru fila Text este: \n");
printf("%d",nr1);
sleep(5);
}
Numarul returnat poate fi utilizat in functiile care solicita "handle".
-114- [ stdio.h -getchar() si putchar() ]
FUNCTIA getchar()
-citeste un caracter de la dispozitivul de intrare (stdin)
SINTAXA GENERALA este: int getchar(void);
Functia(de fapt este un macro),citeste caracterul curent din fluxul de
date standard stdin asociat dispozitivului de intrare a datelor(de obicei
tastatura,dar poate fi o placa I/O,o placa de retea,modem etc.).Este
definita ca si cand ar fi de tipul getc(stdin).Functia returneaza primul
caracter ce urmeaza dupa pozitia cursorului din streamul stdin.
Daca functia a fost executata cu succes,returneaza caracterul preluat
dupa conversia acestuia la formatul int.In caz de eroare,returneaza EOF.
Este similara cu fgetchar() dar este implementata atat ca functie cat si
ca macro.
Limbajul C++ accepta si functia getwchar(),care este similara dar
opereaza doar cu majuscule.Toate functiile din C++ care opereaza cu
majuscule(getwc,getwchar,putwc,putwchar...etc) sunt arhivate intr-o fila
speciala cu antetul .
EXEMPLU: #include
Dostları ilə paylaş: |
|
|