Limbajul c si C++ abc-doar


la codul numeric 97-122 la codul numeric 65-90).Practic,functia scade



Yüklə 4,6 Mb.
səhifə49/55
tarix07.05.2018
ölçüsü4,6 Mb.
#50260
1   ...   45   46   47   48   49   50   51   52   ...   55

la codul numeric 97-122 la codul numeric 65-90).Practic,functia scade

valoarea 32 din codul numeric al minusculei.Functia nu afecteaza restul

caracterelor ASCII,care raman neschimbate,dar accepta valori pentru

ch cuprinse intre 0 si 255.

Functia returneaza majuscula (litera mare).

EXEMPLU: #include

#include

#include

int a,nr;

main()

{ for (a=97;a<123;a++)

{ nr=toupper(a);

printf("%c se transforma in %c \n",a,nr);

}

sleep(3); }
CONSTANTE,TIPURI DE DATE SI VARIABILE GLOBALE
_ctype[] este o variabila globala utilizata de catre toate functiile

din fila ctype.h pentru a evalua caracterul specificat.Este

o arie de memorie si contine informatii despre atributele

caracterului,respectiv valoarea ASCII+1.Fiecare adresa din

aria de memorie contine un set de biti care descriu carac-

terul specificat.

-IS_xxx sunt constante care sunt utilizate de catre variabila _ctype

pentru a arhiva atributele unui caracter sub forma de adrese

de memorie din arie (vezi mai sus).Pot fi:

_IS_SP =is space (caracterul este spatiu gol)

_IS_DIG =is digit (caracterul este digital)

_IS_UPP =is uppercase (caracterul este majuscula)

_IS_LOW =is lowercase (caracterul este minuscula)

_IS_HEX =is hexa (caracterul este hexazecimal)

_IS_CTL =is control (este caracter de control)

_IS_PUN =is punctuation (este caracter de punctuatie)


-373- [ dir.h-chdir() si findfirst() ]

BIBLIOTECA C fila antet

-contine structuri,macro-uri si functii care opereaza cu directoare si

cu caile de acces la fisiere (PATH).
FUNCTIA chdir()

-schimba directorul curent

SINTAXA GENERALA este: int chdir(const char *path);

Functia schimba directorul curent cu cel specificat prin pointerul *path.

Este obligatoriu ca directorul specificat sa existe pe disc (nu se poate

declara un director virtual).

In calea de acces spre directorul specificat se poate declara si unitatea

de memorie(Exemplu: chdir("a:\\BC")),dar prin aceasta comanda se va schim-

ba doar directorul curent nu si unitatea activa de memorie (adica C: ).

In versiunea Windows,functia are efect doar asupra procesului curent iar

in versiunea DOS,functia schimba directorul curent si pentru procesul

parinte (functia main() ).

Functia returneaza 0 (zero) daca a fost executata cu succes,sau -1 in caz

de eroare si seteaza errno la valoarea ENOENT (path or file not found).

EXEMPLU: #include

#include


#include

#include

main()

{ printf("Executabilele din directorul curent sunt: \n");

system("dir *.exe");

sleep(3);

clrscr();

chdir("INCLUDE");

printf("Filele din directorul INCLUDE sunt: \n");

sleep(1);

system("dir *.h");

sleep(3);

}

In exemplul de mai sus,dupa executia functiei chdir() directorul curent

ramane in INCLUDE.Pentru a nu introduce date in biblioteca de functii a

programului,este prudent sa iesiti din TC dupa executia exemplului si

apoi sa reporniti cu TC.exe,sau sa schimbati directorul curent cu o noua

comanda.
FUNCTIA findfirst()

-cauta pe disc fila specificata

SINTAXA GENERALA este:

int findfirst(const char *pathname,struct ffblk *ffblk,int attrib);

Functia cauta pe disc fisierul specificat prin calea de acces descrisa

in pointerul *pathname,si arhiveaza atributele acestuia in structura de

tip ffblk (specificata prin *ffblk).Pentru numele filei(fisierului) se

pot utiliza si caractere wild (cu sens general) de tipul ?(inlocuieste

o litera) sau *(inlocuieste orice caracter).

Daca exista pe disc o fila cu numele identic cu cel specificat,sau daca

exista o fila care se potriveste cu definitia data de caracterele wild,

atributele filei vor fi arhivate in structura de tip ffblk.


-374- [ dir.h - findfirst() ]

In versiunea WIN 16 (si DOS) structura de tip ffblk are forma generala:

struct ffblk { char ff_reserved[21] /*reservata pentru DOS */

char ff_attrib; /*atributul gasit */

int ff_ftime; /*ora arhivarii */

int ff_fdate; /*data arhivarii */

long ff_fsize; /*dimensiunea filei */

char ff_name[13]; /*numele filei (cel gasit) */

};

In versiunea WIN 32 structura de tip ffblk are forma generala:

struct ffblk { long ff_reserved;

long ff_size;

unsigned long ff_attrib;

unsigned short ff_ftime;

unsigned short ff_fdate;

char ff_name[256];

};

diferenta consta in tipul de data al membrilor si in lungimea maxima a

numelui acceptat pentru fila (8 caractere+extensie pentru DOS si 256

de caractere inclusiv extensia pentru Windows)

Atributul filei cautate se specifica prin attrib si poate fi: FA_RDONLY,

FA_HIDDEN,FA_SYSTEM,FA_LABEL,FA_DIREC sau FA_ARCH (respectiv codul numeric

al atributului 0-5).Atributele pot fi specificate si cu operatorul OR

(pentru a cauta mai multe tipuri de file simultan).

Semnificatia datelor arhivate in ff_ftime este urmatoarea:

bitii 0-4 arhiveaza secundele/2 (10 inseamna 20 de secunde)

bitii 5-10 arhiveaza minutele

bitii 11-15 arhiveaza orele

Semnificatia datelor arhivate in ff_date este urmatoarea:

bitii 0-4 arhiveaza ziua

bitii 5-8 arhiveaza luna calendaristica

bitii 9-15 arhiveaza anii dupa 1980 (exemplu: 9 inseamna 1989)

ff_ftime si ff_fdate sunt similare cu structura ftime din (vezi)

Functia returneaza 0 daca fila a fost gasita cu succes,sau - 1 in caz de

eroare si seteaza variabila globala errno la valoarea ENOENT sau variabila

_doserrno [C++] la ENOENT sau ENMFILE (no more files).

EXEMPLU: #include

#include

#include

struct ffblk date1;

main()

{ findfirst(" *.c",&date1,0);

printf("Prima aplicatie de tip .c este fila: \n");

printf("%s \n",date1.ff_name);

printf("creata la data de: %u \n",date1.ff_fdate);

printf("si la ora: %u \n",date1.ff_ftime);

sleep(3);

}

Functia se poate utiliza pentru a identifica o fila pe disc,sau mai multe

file,daca se utilizeaza impreuna cu findnext().ATENTIE:-prin utilizarea

caracterelor wild,pot exista un numar foarte mare de file care corespund

cu definitia generala,dar functia o va identifica doar pe prima.


-375- [ dir.h -findnext() si fnmerge() ]

FUNCTIA findnext()

-cauta o fila intr-un director (urmatoarea fila)

SINTAXA GENERALA este: int findnext(struct ffblk *ffblk);

Functia se utilizeaza impreuna cu findfirst().Utilizeaza aceeasi structura

de tip ffblk spre care este orientat pointerul specificat prin *ffblk,

pentru a arhiva datele citite.Functia identifica urmatoarea fila care

corespunde cu definitia din findfirst().Vezi si findfirst().

Functia returneaza 0 (zero) daca a fost executata cu succes,sau -1 in caz

de eroare(si seteaza errno la o valoare ENOENT).

EXEMPLU: #include

#include

#include

struct ffblk date1;

main()

{ findfirst("*.c",&date1,0);

printf("Prima aplicatie de tip .c este fila: \n");

printf("%s \n",date1.ff_name);

printf("Urmatoarele aplicatii sunt: \n");

findnext(&date1);

printf("%s \n",date1.ff_mane);

findnext(&date1);

printf("%s \n",date1.ff_name);

sleep(3);

}
FUNCTIA fnmerge()

-construieste o cale de acces din parti componente

SINTAXA GENERALA este: const char *path,*drive,*dir,*name,*ext;

void fnmerge(path,drive,dir,name,ext);

Functia construieste calea de acces la fisier din fragmente reprezentate

prin siruri de tip caracter,care contin datele necesare.Sirurile sunt

accesate prin intermediul unor pointeri care specifica dupa cum urmeaza:

path - este calea nou construita (Exemplu: X:\DIR\SUBDIR\NAME.EXT )

drive-este unitatea de memorie (Exemplu: X )

dir -este directorul si subdirectorul (Exemplu: DIR\SUBDIR )

name -este numele filei( Exemplu: NAME )

ext -este extensia (Exemplu: .EXT)

Daca oricare dintre siruri este NULL,calea de acces construita nu va con-

tine elementul respectiv (Exemplu: daca dir=NUL rezulta X:\NAME.EXT )

Sirul specificat prin pointerul *path trebuie sa fie suficient de lung

pentru ca sa poata contine definitia realizata (calea construita),dar

trebuie sa fie mai scurt sau egal cu MAXPATH (constanta care specifica

lungimea maxima pentru PATH acceptata de catre sistemul de operare).

Functia este reciproca si invertibila cu fnsplit(),care desparte o cale

de acces in fragmentele sale componente.Astfel,orice cale de acces des-

compusa cu fnsplit() poate fi reconstruita cu fnmerge() si respectiv,orice

cale de acces construita cu fnmerge() poate fi separata in componente cu

fnsplit().Ambele functii utilizeaza aceeasi pointeri spre aceleasi siruri

de tip caracter.Ambele functii se utilizeaza pentru a construi,a schimba,

sau pentru a analiza calea de acces la file si fisiere.

Functia nu returneaza nici o valoare (depanabila).


-376- [ dir.h -fnsplit() ]

EXEMPLU: #include

#include

#include

char *cale;

char *unit="C:\\";

char *dosar="USR\\";

char *nume1="FISIER1";

char *ext=".TXT";

main()

{ printf("Calea actuala este: %s \n",getcwd(cale,MAXPATH));

fnmerge(cale,unit,dosar,nume1,ext);

printf("Noua cale de acces este: \n");

puts(cale);

sleep(3);

}

Observati ca pointerul *cale contine doar adresa sirului in care se sal-

veaza noua cale de acces,nu arhiveaza datele.Astfel,printf("%s",cale)

returneaza NULL.
FUNCTIA fnsplit()

-separa o cale de acces in elementele componente (inversa lui fnmerge() )

SINTAXA GENERALA este: const char *path,*drive,*dir,*name,*ext;

int fnsplit(path,drive,dir,name,ext);

Functia separa calea de acces in elementele de baza,adica unitatea de

memorie(drive),directorul si subdirectorul(dir),numele filei(name) si

extensia filei(ext).Functia utilizeaza aceeiasi pointeri si cu aceeasi

semnificatie ca si functia fnmerge().Definitia functiei trebuie sa contina

toti cei cinci pointeri,chiar daca unii dintre ei vor pointa spre siruri

nule.Daca o cale de acces nu contine unul dintre elemente (Exemplu: C: ),

atunci elementul respectiv va fi analizat dar nu va fi salvat in sirul

specificat.Lungimea maxima a fiecarui sir rezultat este determinata de

constantele MAXDRIVE,MAXDIR,MAXPATH,MAXFILE si MAXEXT,definite in dir.h

astfel: Constanta win16 win32 sirul rezultat

MAXPATH 80 256 calea rezultata

MAXDRIVE 3 3 unitatea (inclusiv :)

MAXDIR 66 260 sub- si director +\\

MAXFILE 9 256 numele filei

MAXEXT 5 256 extensia (inclusiv .)

Se observa ca versiunile pe 32 de biti accepta denumiri mult mai lungi si

mult mai complexe (inclusiv extensii din 255 de caractere).

Functia fnsplit() poate fi executata doar daca fiecare dintre sirurile

specificate contine spatiu suficient pentru arhivarea datelor preluate

(este prudent sa fie definite la valoarea MAX... a sirului corespunzator).

La separarea caii de acces,functia respecta urmatoarele reguli de punctua-

tie: drive(unitatea) contine si cele doua puncte (Exemple: C:,A: sau B:)

dir (directorul) include si liniutele despartitoare ( \USR\TC\ etc )

name (numele) include numele filei

ext (extensia) include si punctul de separatie (Exemple: .EXE .TXT)

Functia returneaza un numar int care indica elementele componente din

calea de acces (EXTENSION,FILENAME,DIRECTORY,DRIVE,WILDCARDS).

Numarul rezultat poate fi utilizat pentru depanarea automata.


-377- [ dir.h -getcurdir() si getcwd() ]

EXEMPLU: #include

#include

#include

char *cale;

char unit[3];

char dosar[16];

char nume1[20];

char ext[5];

int nr;

main()

{ cale=getcwd(cale,80);

strcat(cale,"\\text1.txt");

puts(cale);

nr=fnsplit(cale,unit,dosar,nume1,ext);

printf("drive= %s \n",unit);

printf("director= %s \n",dosar);

printf("fila= %s \n",nume1);

printf("extensia= %s \n",ext);

printf("nr= %d\n",nr);

sleep(3);

}
FUNCTIA getcurdir()

-citeste directorul curent pentru unitatea specificata

SINTAXA GENERALA este: int getcurdir(int drive,char *directory);

Functia citeste directorul curent si orienteaza pointerul specificat prin

*directory spre aria de memorie in care se va salva numele directorului

curent (pointerul nu contine numele).Unitatea de memorie se specifica prin

codul numeric (0=A,1=B,2=C etc...).Numele directorului poate avea lungimea

maxima egala cu MAXDIR (66 respectiv 260 caractere) si nu contine nici

numele unitatii de memorie,nici liniutele de separatie \\.

(Exemplu: din C:\USR\fila1.txt va contine doar USR )

Functia returneaza 0 in caz de reusita sau -1 in caz de eroare.

EXEMPLU: #include

#include

#include

int nr;

char dosar[80];

main()

{ nr=getcurdir(3,dosar);

printf("Directorul curent este: %s \n",dosar);

sleep(3);

}
FUNCTIA getcwd()

-citeste directorul curent pentru unitatea activa

SINTAXA GENERALA este: char *getcwd(char *buf,int buflen);

Functia citeste intreaga cale de acces (inclusiv unitatea) la directorul

curent(activ),pana la lungimea maxima specificata prin buflen (lungimea

tamponului de memorie) si o arhiveaza in tamponul de memorie specificat

prin pointerul *buf.Daca tamponul este mai mic decat calea de acces,apare


-378- [ dir.h-getdisk() si mkdir() ]

o eroare si erno este setata ERANGE(nume mai lung decat tamponul).

Daca tamponul specificat prin buf este NULL,functia va aloca automat un

tampon de memorie cu lungime egala cu cea specificata prin buflen,prin

apel la functia malloc().Pentru eliberarea ulterioara a tamponului puteti

utiliza functia free().

Functia returenaza una dintre urmatoarele valori:

-daca buf nu este NULL,functia returneaza directorul citit in caz de

succes sau returneaza NULL in caz de eroare

-daca buf este NULL la apelarea functiei,getcwd() va returna un pointer

spre tamponul alocat automat cu malloc(),sau in caz de eroare returneaza

NULL si seteaza errno la una dintre urmatoarele valori:

ENODEV -nu exista unitatea de memorie

ENOMEM -nu exista suficienta memorie pentru a aloca tamponul

ERANGE -directorul este mai lung decat tamponul de memorie

EXEMPLU: #include

#include

#include

char acces[80];

main()

{ getcwd(acces,80);

printf("Calea de acces curenta este: %s \n",acces);

sleep(3);

}

Eventual repetati exercitiul cu dimensiuni diferite ale tamponului de

memorie si evaluati rezultatul.
FUNCTIA getdisk()

-citeste unitatea de memorie instalata

SINTAXA GENERALA este: int getdisk();

Functia citeste si returneaza codul numaric al unitatii de memorie insta-

late (0=A,1=B,2=C etc.).

Functia returneaza o valoare de tip int (codul unitatii)

EXEMPLU: #include

#include

#include

int nr;

main()

{ nr=getdisk();

printf("Unitatea de memorie activa este: %d \n",nr);

sleep(3);

}
FUNCTIA mkdir()

-creeaza un director

SINTAXA GENERALA este: int mkdir(const char *path);

Functia creeaza un nou director care va avea calea de acces egala cu cea

specificata prin pointerul *path.

Functia este implementata si in versiunea UNIX ( cu un parametru in plus).

Functia returneaza 0 (zero) daca directorul a fost creat sau -1 in caz de

eroare si setaeaza errno la EACCES (acces interzis) sau ENOENT( nu exista

fila sau directorul).


-379- [ dir.h-mktemp() si rmdir() ]

EXEMPLU: #include

#include


#include

#include

main()

{ printf("Se creeaza directorul ARHIVA: \n");

mkdir("ARHIVA");

system("DIR/p");

sleep(3);

printf("Se sterge directorul ARHIVA: \n");

rmdir("ARHIVA");

system("DIR/p");

sleep(3);

}
FUNCTIA mktemp()

-selecteaza un nume unic pentru o fila noua

SINTAXA GENERALA este: char *mktemp(char *template);

Functia inlocuieste sirul spre care este orientat pointerul *template cu

un nume unic (care nu exista pe disc),nume ce poate fi utilizat pentru a

creea o fila noua.

Sirul pointat de *template trebuie sa fie terminat prin caracterul NULL

terminal si sa contina sase caractere terminale X,care vor fi inlocuite

cu numele unic creeat.Numele unic nou construit va fi format din o serie

de litere si un punct despartitor.Primul nume construit va fi AA.AAA,iar

urmatorul va fi AA.AAB (in caz ca exista o fila AA.AAA).Functia verifica

toate filele de pe disc,apoi creaza primul nume unic din serie(primul care

nu exista deja pe disc.Daca sirul pointat contine mai mult de 6 caractere

,ultimele 6 trebuie sa fie XXXXXX,celelalte raman nemodificate.

Functia returneaza adresa sirului pointat de template (in caz ca sirul

a fost inlocuit prin noul nume) sau NULL in caz de eroare.

EXEMPLU: #include

#include

#include

char *nume="FILA_XXXXXX";

char *pointer1;

main()

{ pointer1=mktemp(nume);

printf("Numele unic este: %s \n",pointer1);

sleep(3);

}
FUNCTIA rmdir()

-sterge un director (irecuperabil)

SINTAXA GENERALA este: int rmdir(const char *path);

Functia sterge directorul specificat prin calea de acces continuta in

sirul pointat de *path.Directorul trebuie sa fie gol (fara file),trebuie

sa nu fie director curent si sa nu fie director de ramificate (sa nu

contina subdirectoare pline sau goale).

Functia returneaza zero in caz de succes sau -1 in caz de eroare (+errno)

EXEMPLU: vezi mkdir() (vezi inceputul de pagina)


-380- [ dir.h-searchpath() si setdisk()]

FUNCTIA searchpath()

-apeleaza sistemul de operare pentru a cauta fila specificata

SINTAXA GENERALA este: char *searchpath(const char *file);

Functia utilizeaza PATH= din mediul de operare al sistemului de operare,

pentru a identifica pentru fila specificata calea de acces si returneaza

Yüklə 4,6 Mb.

Dostları ilə paylaş:
1   ...   45   46   47   48   49   50   51   52   ...   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