|
la codul numeric 97-122 la codul numeric 65-90).Practic,functia scade
|
səhifə | 49/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| 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
Dostları ilə paylaş: |
|
|