Limbajul c si C++ abc-doar


Resource temporary unavailable 20.Invalid enviroment 21.Invalid format



Yüklə 4,6 Mb.
səhifə16/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   12   13   14   15   16   17   18   19   ...   55

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

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   12   13   14   15   16   17   18   19   ...   55




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin